Tes Multiplisitas


21

Gunakan bahasa pemrograman apa pun untuk menampilkan angka antara 1 dan 99 (termasuk keduanya) sedemikian rupa, sehingga:

  • jumlahnya dipisahkan oleh ruang tunggal,
  • jika angka dapat dibagi 3, itu harus dalam tanda kurung,
  • jika angka dapat dibagi 4, itu harus dalam tanda kurung,
  • jika angka dapat dibagi dengan 3 dan 4, itu harus dalam kurung dan kurung kotak (dengan kurung kotak lebih dekat ke nomor).

Program Anda harus menampilkan dengan tepat:

1 2 (3) [4] 5 (6) 7 [8] (9) 10 11 ([12]) 13 14 (15) [16] 17 (18) 19 [20] (21) 22 23 ([24]) 25 26 (27) [28] 29 (30) 31 [32] (33) 34 35 ([36]) 37 38 (39) [40] 41 (42) 43 [44] (45) 46 47 ([48]) 49 50 (51) [52] 53 (54) 55 [56] (57) 58 59 ([60]) 61 62 (63) [64] 65 (66) 67 [68] (69) 70 71 ([72]) 73 74 (75) [76] 77 (78) 79 [80] (81) 82 83 ([84]) 85 86 (87) [88] 89 (90) 91 [92] (93) 94 95 ([96]) 97 98 (99)


3
Bisakah kita mengeluarkan setiap entri pada baris baru, atau haruskah semua output berada pada satu baris?
ETHproduk

4
Bisakah keluaran berakhir dengan spasi. Beberapa jawaban tampaknya berasumsi demikian.
Dennis

Jawaban:





4

Jelly , 21 20 byte

³Ṗµ3,4ṚƬḍד([“])”j)K

Cobalah online!

Bagaimana itu bekerja

³Ṗµ3,4ṚƬḍד([“])”j)K  Main link. No arguments.

³                     Set the return value to 100.
 Ṗ                    Pop; yield [1, ..., 99].
  µ               )   Map the chain in between over [1, ..., 9]; for each integer k:
   3,4                    Set the return value to [3, 4].
      ṚƬ                  Reverse until a loop is reached. Yields [[3, 4], [4, 3]].
        ḍ                 Test k for divisibility by [[3, 4], [4, 3]], yielding a
                          matrix of Booleans.
         ד([“])”         Repeat the characters of [['(', '['], [']', ')']] as many
                          times as the Booleans indicate.
                 j        Join the resulting pair of strings, separated by k.
                   K  Join the resulting array of strings, separated by spaces.

3

D , 110 byte

import std.stdio;void f(){for(int i;i<99;)write(++i%3?"":"(",i%4?"":"[",i,i%4?"":"]",i%3?"":")",i%99?" ":"");}

Cobalah online!

Porting dari jawaban C ++ @ HatsuPointerKun.


3

Arang , 30 byte

⪫EEE⁹⁹I⊕ι⎇﹪⊕κ⁴ι⪫[]ι⎇﹪⊕κ³ι⪫()ι 

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

    ⁹⁹                          Literal 99
   E                            Map over implicit range
        ι                       Current value
       ⊕                        Incrementd
      I                         Cast to string
  E                             Map over list of strings
            κ                   Current index
           ⊕                    Incremented
             ⁴                  Literal 4
          ﹪                     Modulo
              ι                 Current value
                []              Literal string `[]`
                  ι             Current value
               ⪫                Join i.e wrap value in `[]`
         ⎇                      Ternary
 E                              Map over list of strings
                      κ         Current index
                     ⊕          Incremented
                       ³        Literal 3
                    ﹪           Modulo
                        ι       Current value
                          ()    Literal string `()`
                            ι   Current value
                         ⪫      Join i.e wrap value in `()`
                   ⎇            Ternary
                                Literal space
⪫                               Join list
                                Implicitly print

3

J , 54 53 byte

1 byte lebih sedikit berkat @Jonah

(*stdout(3|.0=4 3 1 3 4&|,1=":)#3|.']) ([',":)@>i.100

Cobalah online!


Terima kasih sudah melakukan ini. Juga, mengapa Anda harus melakukannya di stdoutsini ... Saya belum pernah melihat itu sebelumnya. @FrownyFrog
Jonah

@Jonah Saya tidak bisa menampilkannya sebagai string lengkap, itu akan memotong (...) stdout tidak melakukan itu, dan tidak mencetak baris baru juga, jadi saya juga dapat mencetak setiap nomor secara terpisah. Untuk beberapa alasan meskipun itu membuat spasi tambahan muncul (ada 4, dan hanya 1 yang sengaja ada di sana)
FrownyFrog

Pendekatan ini sangat pintar, baik rotasi dan pilihan untuk digunakan #. Saya telah memperkenalkan tambahan kata kerja untuk surround dengan ()dan []: g=. {.@[ , ":@] , {:@[. ugh verboseness!
Jonah

satu pertanyaan lagi: alasan apa pun yang Anda gunakan LFalih-alih _. yang terakhir tampaknya bekerja juga.
Jonah

3

C, C ++, 136 133 131 129 128 124 byte

-5 byte terima kasih kepada Zacharý dan terinspirasi oleh fungsi write () dalam bahasa D (lihat jawaban Zacharý)

-2 byte terima kasih kepada mriklojn

-12 byte untuk versi C berkat mriklojn

-4 bytes berkat ceilingcat

#include<cstdio>
void f(){for(int i=0;i++<99;)printf("(%s%d%s%s%s"+!!(i%3),i%4?"":"[",i,i%4?"":"]",i%3?"":")",i%99?" ":"");}

C Pengoptimalan Khusus: 115 byte

#include<stdio.h>
i;f(){for(;i++<99;)printf("(%s%d%s%s%s"+!!(i%3),i%4?"":"[",i,i%4?"":"]",i%3?"":")",i%99?" ":"");}

Apakah MSVC membiarkan Anda melakukan inf f()hal itu? Maaf tentang menghapus komentar saya, pikir saya memiliki sesuatu yang lebih pendek (saya tidak)
Zacharý

@ Zacharý Tidak, saya pikir fungsinya terlalu sederhana dan menghasilkan "f harus mengembalikan int". BTW, solusi Anda adalah 3 byte lebih pendek (termasuk kompresi dipasangkan dengan memindahkan kenaikan i)
HatsuPointerKun

1
Dang, sama sekali lupa tentang printfsesuatu. Tidak bisakah kamu menggunakan C stdio kalau begitu?
Zacharý

2
Hal lain yang dapat Anda gunakan / eksploitasi adalah kenyataan bahwa, setidaknya dengan gcc 5.3.1, Anda tidak perlu #include, dan Anda juga dapat menghapus tipe pengembalian fungsi. Selain itu, jika Anda mendeklarasikan int ifungsi di luar (dalam lingkup global) maka nilainya default ke 0 dan tipe data default ke int. Ini akan menghasilkan loop Anda mulai dari 0, dan untuk memperbaikinya Anda bisa memindahkan kenaikan ke ekspresi kondisi di loop Anda, membuatnya terlihat sepertii;f(){for(;++i<=99;)
mriklojn

1
Sarankan ")\0"+i%3alih-alih i%3?"":")". Juga, saya pikir Anda perlu menambahkan i=0di awal loop.
ceilingcat

3

Powershell, 60 byte

"$(1..99|%{($_,"($_)","[$_]","([$_])")[!($_%3)+2*!($_%4)]})"

Penjelasan:

  • array dengan 4 elemen: $_, "($_)", "[$_]", "([$_])"
  • dan indeks: [!($_%3)+2*!($_%4)]
  • ulangi untuk setiap nomor
  • ubah hasilnya menjadi string

Skrip Tes yang kurang golf:

$f = {

$r = 1..99|%{
    ($_, "($_)", "[$_]", "([$_])") [!($_%3)+2*!($_%4)]
}
"$($r)"

}

$expected = '1 2 (3) [4] 5 (6) 7 [8] (9) 10 11 ([12]) 13 14 (15) [16] 17 (18) 19 [20] (21) 22 23 ([24]) 25 26 (27) [28] 29 (30) 31 [32] (33) 34 35 ([36]) 37 38 (39) [40] 41 (42) 43 [44] (45) 46 47 ([48]) 49 50 (51) [52] 53 (54) 55 [56] (57) 58 59 ([60]) 61 62 (63) [64] 65 (66) 67 [68] (69) 70 71 ([72]) 73 74 (75) [76] 77 (78) 79 [80] (81) 82 83 ([84]) 85 86 (87) [88] 89 (90) 91 [92] (93) 94 95 ([96]) 97 98 (99)'
$result = &$f
$result-eq$expected
$result

Keluaran:

True
1 2 (3) [4] 5 (6) 7 [8] (9) 10 11 ([12]) 13 14 (15) [16] 17 (18) 19 [20] (21) 22 23 ([24]) 25 26 (27) [28] 29 (30) 31 [32] (33) 34 35 ([36]) 37 38 (39) [40] 41 (42) 43 [44] (45) 46 47 ([48]) 49 50 (51) [52] 53 (54) 55 [56] (57) 58 59 ([60]) 61 62 (63) [64] 65 (66) 67 [68] (69) 70 71 ([72]) 73 74 (75) [76] 77 (78) 79 [80] (81) 82 83 ([84]) 85 86 (87) [88] 89 (90) 91 [92] (93) 94 95 ([96]) 97 98 (99)

3

MathGolf , 41 40 34 29 byte

♀({îû)(î+╫îa_'(\')ßyΓî34α÷ä§ 

CATATAN: Ini memiliki ruang tambahan

Hanya jawaban MathGolf kedua saya ..
-5 byte berkat @ JoKing .

Cobalah online.

Penjelasan:

♀(             # Push 99 (100 decreased by 1)
  {            # Start a loop, which implicitly loops down to (and excluding) 0
   û)(         #  Push string ")("
      î+       #  Append the 1-indexed index
              #  Rotate the string once towards the right
   îa          #  Push the 1-indexed index of the loop, wrap in a list
   _           #  Duplicate it
    '(        '#  Push string "("
      \        #  Swap the top two items of the stack
       ')     '#  Push string ")"
         ßy    #  Wrap all three into a list, and join them
   Γ           #  Wrap all four into a list
               #  (We now have a list [N, "(N)", "[N]", "([N])"], where N is the index)
   î           #  Push the 1-indexed index of the loop
    34         #  Push 3 and 4 to the stack
      α        #  Wrap all three into a list
       ÷       #  Check for each if the index is divisible by it
               #  (resulting in either [0,0], [0,1], [1,0], or [1,1]
        ä      #  Convert from binary to integer
               #  (resulting in either 0, 1, 2, or 3
         §     #  Push the string at that index from the array
               #  Push a space
               # (After the loop, output the entire stack joined together implicitly)

@JoKing, terima kasih! Tidak tahu itu qbisa dihilangkan dan itu dilakukan secara implisit dalam loop. Juga, tidak tahu ada builtin 2/3/4-string. Sayang sekali trik rotate tidak bekerja dengan array yang dibungkus.
Kevin Cruijssen

Yah, itu lebih karena saya telah memperdagangkan output eksplisit setiap iterasi untuk output implisit pada akhir program sebagai gantinya
Jo King

@ JoKing Ya, tapi saya tidak tahu itu akan menampilkan seluruh tumpukan bergabung, bukan hanya bagian atas. :)
Kevin Cruijssen

Solusi saya mendekati 40 byte, meskipun saya salah membaca dan berpikir bahwa kurung keriting harus digunakan daripada kurung. Kerja bagus di solusinya!
Maks.


2

Lua, 161 123 byte

b=""for i=1,99 do;c,d=i%3==0,i%4==0;b=b..(c and"("or"")..(d and"["or"")..i..(d and"]"or"")..(c and")"or"").." "end;print(b)

Cobalah online!

Tidak Disatukan:

b = ""
for i = 1, 99 do
    c = 1 % 3 == 0
    d = 1 % 4 == 0
    a = ""
    if c then
        a = a .. "("
    end
    if d then
        a = a .. "["
    end
    a = a .. i
    if d then
        a = a .. "]"
    end
    if c then
        a = a .. ")"
    end
    b = b .. a .. " "
end
print(b)


2

C (gcc) , 84 byte

main(i){while(99/i++)printf("%s%s%d%s%s ","("+i%3,"["+i%4,i-1,"]"+i%4,")"+i%3);}

Ada byte nol di awal setiap "string braket".

Cobalah online!


Dan di "(" + i% 3 bagaimana Anda tahu alamat untuk i = 2 menunjuk ke nilai nol char? Sama untuk "[" + i% 4 untuk i di {2,3}?
RosLuP

Ini bekerja dengan gcc, yang cukup baik, karena PPCG mendefinisikan bahasa berdasarkan implementasinya.
Dennis

Saya pikir Anda tidak bisa mengatakan kode itu ok dikompilasi dalam setiap implementasi gcc compiler, mungkin hanya yang berjalan di komputer Anda (tapi mungkin juga tidak)
RosLuP

@RosLuP gcc melakukan pekerjaan dengan cara yang sama pada kebanyakan komputer meskipun, setidaknya pada apa pun dengan arsitektur yang sama
ASCII-satunya

@ ASCII-hanya mungkin jika dikompilasi dioptimalkan untuk ruang atau untuk kecepatan hasilnya berbeda ... Saya tidak tahu apakah itu di luar standar ...
RosLuP

2

PowerShell , 67 62 byte

"$(1..99|%{'('*!($x=$_%3)+'['*!($y=$_%4)+$_+']'*!$y+')'*!$x})"

Cobalah online!

Pada dasarnya sebuah FizzBuzz menggunakan perkalian string kali variabel Boolean (secara implisit dilemparkan ke 1 atau 0). String-string itu ditinggalkan di jalur pipa dan dikumpulkan di dalam blok skrip di dalam tanda kutip. Karena default $OutputFieldSeparatoruntuk array adalah spasi, ini secara implisit memberi kita elemen array yang dibatasi ruang.


2

C #, 124 117 123 byte

-5 byte terima kasih kepada Kevin Cruijssen

x=>{for(int i=0;i++<99;)System.Console.Write((i%3<1?"(":"")+(i%4<1?"[":"")+i+(i%4<1?"]":"")+(i%3<1?")":"")+(i>98?"":" "));}

Uji dengan:

Action<int> t = x=>{for(int i=0;i++<99;)System.Console.Write((i%3<1?"(":"")+(i%4<1?"[":"")+i+(i%4<1?"]":"")+(i%3<1?")":"")+(i>98?"":" "));}
t.Invoke(0);
Console.ReadKey();

Ke dalam perebutan C #, begitu. Apakah C # memungkinkan bilangan bulat sebagai argumen kiri ke operator ternary, atau harus boolean?
Zacharý

Saya tidak tahu banyak tentang C #, tetapi bisakah Anda menggunakan xalih-alih i, sehingga tidak perlu khawatir tentang C # int ? (Anda masih harus mengaturnya, tentu saja).
Zacharý

@ Zacharý Tidak, ini menghasilkan kesalahan CS0029 "Tidak dapat mengkonversi int secara implisit menjadi boolean". Dan ya, saya bisa menggunakan idan fakta bahwa saya dapat menginisialisasi pada 0 ketika saya Invoke. Tapi bukankah itu berarti saya harus memasukkan deklarasi t ( Action<int>) dan panggilan ( t.Invoke(0)) dalam bytecount?
HatsuPointerKun

Saya bertanya apakah sesuatu seperti x=>{for(x=0;x++<99;)Console.Write((x%3==0?"(":"")+(x%4==0?"[":"")+x+(x%4==0?"]":"")+(x%3==0?")":"")+(x%99==0?"":" "));};akan berhasil.
Zacharý

1
Kelima ==0bisa <1.
Kevin Cruijssen


2

Ruby , 72 66 byte

p [*1..99].map{|x|a=x
a="[#{x}]"if x%4<1
a="(#{a})"if x%3<1
a}*' '

Terima kasih kepada @ jonathan-frech dan @ conor-obrien untuk pemangkasan tambahan.


Halo dan selamat datang di PPCG! 70 byte .
Jonathan Frech

Selamat datang di PPCG! Berikut ini 4 byte dari saran @JonathanFrench, untuk 66 byte , karena a.join buntuk array adan string bsetara dengana*b
Conor O'Brien

2

PowerShell, 98 82 74 67 63 62 byte

-31 byte berkat @Veskah -5 byte berkat @ ASCII saja

(1..99|%{(($a=($_,"[$_]")[!($_%4)]),"($a)")[!($_%3)]})-join' '

Cobalah online!

Saya masih tidak yakin apa yang telah saya lakukan di sini.


Hanya beberapa golf cepat untuk 70 byte . Anda tidak harus menggunakan $ a sebagai string dan "$a"masih akan mengganti nilainya. (Catatan: Kutipan tunggal tidak menggantikan $foo, hanya tanda kutip ganda). Trik lain adalah seandainya hanya peduli 0 atau 1 sehingga Anda dapat menggunakan logika boolean untuk menyimpan byte
Veskah

67 byte jika Anda menggunakan pengindeksan daftar juga.
Veskah




1

perl -E, 60 byte

$,=$";say map$_%12?$_%3?$_%4?$_:"[$_]":"($_)":"([$_])",1..99

Beberapa byte dapat disimpan jika kita dapat menggunakan baris baru di antara angka-angka: dalam hal ini, kita dapat menghapus $,=$";, mengubah mapke dalam forloop, sambil memindahkan sayke dalam loop.


1
Apakah Anda yang Abigail? Penemu /^1$|^(11+?)\1+$/?
msh210

1
Wow. Sungguh suatu kehormatan memiliki Anda di sini!
msh210

1

Perl 6 , 51 48 byte

put {$_%3??$^a!!"($a)"}(++$_%4??$_!!"[$_]")xx 99

Cobalah online!


Saya akan menyalahgunakan perbedaan antara daftar dan representasi array, seperti ini , tapi saya tidak yakin bagaimana cara menyingkirkan kurung terlampir di seluruh daftar ...
Jo King

@JoKing saya juga memikirkan hal itu, tetapi saya hanya membuat 51-byter ini .
nwellnhof

1

Batch, 145 byte

@set s=
@for /l %%i in (1,1,99)do @set/an=%%i,b=n%%4,p=n%%3&call:c
@echo%s%
:c
@if %b%==0 set n=[%n%]
@if %p%==0 set n=(%n%)
@set s=%s% %n%

Kode jatuh ke dalam subrutin tetapi string sudah dicetak pada titik ini sehingga kode dieksekusi tanpa berbahaya.




1

sfk , 225 byte

for n from 1 to 99 +calc -var #(n)/3+1/3 -dig=0 +calc -var #text*3-#(n) +setvar t +calc -var #(n)/4 -dig=0 +calc -var #text*4-#(n) +xed -var _0_#(t)\[#(n)\]_ _*_#(t)#(n)_ +xed _0*_([part2])_ _?*_[part2]_ +xed "_\n_ _" +endfor

Cobalah online!


1

Bash, 61 byte

-14 byte, terima kasih kepada Dennis

seq 99|awk '{ORS=" ";x=$1%4?$1:"["$1"]";print$1%3?x:"("x")"}'

penjelasan

Cukup mudah:

  • seq menghasilkan 1..99
  • kita pipa itu ke awkdengan pemisah catatan keluaran ( ORS) diatur ke ruang sehingga output adalah satu baris.
  • tubuh awk utama hanya menambahkan "[]" ketika angka dapat dibagi dengan 4, dan kemudian menambahkan, di atas itu, "()" ketika dibagi dengan 3.

Cobalah online!



1

PHP, 65 byte

while($i++<99)echo$i%4?$i%3?$i:"($i)":($i%3?"[$i]":"([$i])")," ";

atau

while($i++<99)echo"("[$i%3],"["[$i%4],$i,"]"[$i%4],")"[$i%3]," ";

(membutuhkan PHP 5.5 atau yang lebih baru)

Jalankan dengan -nratau coba online .


1

Python 2 , 78 byte

i=0
exec"i+=1;u=i%3/-2*(i%4/-3-1);print'([%0d])'[u:7-u:1+(i%3<1<=i%4)]%i,;"*99

Cobalah online!

Saya membayangkan pendekatan keren ini mengiris '([%0d])'tetapi saya tidak bisa mendapatkan ekspresi yang lebih pendek.


1

Java 8, 92 91 byte

-1 byte terima kasih kepada @Dana

i->{for(;i++<99;)out.printf((i>1?" ":"")+(i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i),i);}

Cobalah online!

Solusi alternatif, 82 byte (dengan ruang tambahan di keluaran - tidak yakin apakah itu diizinkan):

i->{for(;i++<99;)out.printf((i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i)+" ",i);}

Penjelasan:

for(;i++<99;)- a for loop yang berjalan dari nilai i(digunakan kembali sebagai input, diambil menjadi 0 dalam kasus ini) menjadi 99

out.printf(<part1>+<part2>,i); - memformat string sebelum segera mencetaknya ke stdout dengan nilai i

di mana <part1>adalah (i>1?" ":"")- mencetak ruang sebelum mencetak angka kecuali nomor itu adalah 1, dalam hal ini menghilangkan spasi

dan <part2>adalah (i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i)- jika ihabis dibagi oleh kedua 3 dan 4, imemiliki kedua persegi dan kurung bulat di sekitarnya; lain jika idapat dibagi 3, imemiliki kurung bundar; lain jika ihabis dibagi 4, imemiliki tanda kurung siku; lain, itidak punya tanda kurung.


Hemat satu byte dengan memindahkan ruang ke awal setiap iterasi loop(i>1:" ":"")
dana

Itu hanya akan berfungsi jika saya mencetak hasilnya secara terbalik (lihat ini ) tetapi sebenarnya akan menghemat 2 byte, bukan 1.
NotBaal

Sayangnya itu tidak sama dengan output yang diharapkan sesuai pertanyaan, tetapi terima kasih atas sarannya!
NotBaal

1
Tautan "coba online" tampaknya rusak. Saya sedang berpikir i->{for(;i++<99;)out.printf((i>1?" ":"")+(i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i),i);}?
dana

1
Ohhhh kamu benar itu berhasil! Terima kasih untuk itu!
NotBaal
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.