Çokluk Testi


21

1 ile 99 arasındaki rakamları (her ikisi de dahil) şekilde görüntülemek için herhangi bir programlama dilini kullanın, böylece:

  • sayılar tek boşlukla ayrılır,
  • Bir sayı 3 ile bölünebilir ise, parantez içinde olmalıdır,
  • sayı 4 ile bölünebilirse, köşeli parantez içinde
  • Bir sayı hem 3 hem de 4 ile bölünebilirse, parantez içinde ve köşeli parantez içinde olmalıdır (sayıya yakın köşeli parantezler içinde).

Programınız tam olarak göstermelidir:

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
Her girişi yeni bir satıra basabilir miyiz, yoksa çıktının tümü bir satırda mı yapılmalıdır?
ETHProductions

4
Çıktı boşlukla bitebilir mi? Bir kaç cevap öyle görünüyor.
Dennis

Yanıtlar:





4

Jöle , 21 20 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

³Ṗµ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 bayt

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

Çevrimiçi deneyin!

@ HatsuPointerKun'un C ++ cevabından alınmıştır.


3

Kömür , 30 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

    ⁹⁹                          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 bayt

@Jonah sayesinde 1 bayt daha az

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

Çevrimiçi deneyin!


Bunu yaptığınız için teşekkürler. Ayrıca, neden stdoutburada yapmak zorundasın ... Bunu daha önce hiç görmedim. @ FrownyFrog
Jonah

@Jonah Komple bir dizge olarak çıktı alamıyorum, kesiliyor (...) Stdout bunu yapmıyor ve yeni bir satır da yazdırmıyor, bu yüzden her sayıyı ayrı olarak yazdırabilirim. Bazı nedenlerden dolayı, takip eden boşlukları görünmesine rağmen (4 tane var ve sadece 1 bilerek var)
FrownyFrog

Bu yaklaşım, hem rotasyon hem de kullanım seçimi açısından oldukça zekice #. Ben bir yardımcı fiil için Surround ile tanıştırmıştı ()ve []: g=. {.@[ , ":@] , {:@[. aygırlık!
Jonah

bir soru daha: LFBunun yerine kullandığınız herhangi bir sebep _. ikincisi de iş gibi görünüyor.
Jonah

3

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

Zacharı sayesinde -5 bayt ve D dilinde write () işlevinden esinlenerek (Zachar'ın cevabına bakınız)

Mriklojn sayesinde -2 bayt

C sürümü için -12 bayt mriklojn sayesinde

Ceilingcat sayesinde -4 bayt

#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 Özel Optimizasyon: 115 bayt

#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?" ":"");}

MSVC bu inf f()şeyi yapmanıza izin veriyor mu? Maalesef 'yorumlarımı
silmeme

@ Zacharý Hayır, fonksiyonun çok basit olduğunu düşünüyorum ve "f bir int döndürmeli" yazıyor. BTW, çözümünüz 3 bayt daha kısaydı (i artışı ile eşleştirilen sıkıştırma dahil)
HatsuPointerKun 10:18

1
Dang, tam olarak bir printfşey olduğunu unuttum . O zaman C stdio'yu kullanamaz mısın?
Zacharı

2
Kullanabileceğiniz / faydalanabileceğiniz bir başka şey de, en azından gcc 5.3.1 ile #include'e ihtiyacınız olmadığından ve fonksiyon dönüş türünü de kaldırabileceğiniz gerçeğidir. Ayrıca, int iişlevin dışını (global kapsamda) bildirirseniz, değeri varsayılan olarak 0, veri türü ise varsayılan olarak verilir int. Bu, döngünün 0'dan başlamasıyla sonuçlanır ve bunu düzeltmek için, artımı, i;f(){for(;++i<=99;)
döngünüzdeki

1
")\0"+i%3Bunun yerine önerin i%3?"":")". Ayrıca, i=0döngünün başına eklemeniz gerektiğini düşünüyorum .
ceilingcat

3

Powershell, 60 bayt

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

Açıklama:

  • 4 elementli dizi: $_, "($_)", "[$_]", "([$_])"
  • ve dizin: [!($_%3)+2*!($_%4)]
  • her numara için tekrarla
  • sonucu bir dizeye dönüştür

Daha az golf oynadı Test senaryosu:

$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

Çıktı:

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 bayt

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

NOT: Sonunda boşluk var

Sadece ikinci MathGolf cevabım .. -JoKing
sayesinde -5 bayt .

Çevrimiçi deneyin.

Açıklama:

♀(             # 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 Teşekkürler! Bunun qatlanabileceğini bilmiyordum ve dolaylı olarak döngüler içinde yapıldı. Ayrıca, 2/3 / 4-string yerleşik bir yapı olduğunu bilmiyordum. Döndürme hilesi, sarılmış diziyle çalışmıyor.
Kevin Cruijssen,

Eh, bunun yerine program sonunda açık çıktılı örtülü çıkış için her bir yinelemesini takas ettik fazlası var
Jo Kral

@JoKing Evet, ama üst kısmın yerine tüm yığının bir araya geldiğini göstereceğimi bilmiyordum. :)
Kevin Cruijssen

Çözümüm 40 byte'a yaklaşıyordu, yine de yanlış yazdım ve köşeli parantez yerine parantez kullanılması gerektiğini düşündüm. Çözümde iyi iş çıkardın!
maxb


2

Lua, 161 123 bayt

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)

Çevrimiçi deneyin!

Ungolfed:

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 bayt

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

Her "parantez dizgisi" nin başında boş bir bayt var.

Çevrimiçi deneyin!


Ve "(" + i% 3'te, i = 2 için adresin sıfır karaktere işaret ettiğini nasıl biliyorsunuz? {[} + {2,3}
RosLuP

PPCG dillerini kendi uygulamaları ile tanımladığı için yeterince iyi olan gcc ile çalışır.
Dennis,

Ben size pc o gcc derleyicisi her uygulanmasında Tamam derlendiğini kodu, belki sadece bir koşmak diyemeyiz düşünüyorum (çok ama mümkün değildir)
RosLuP

@RosLuP gcc , çoğu bilgisayarda aynı şekilde çalışır, en azından aynı mimariye sahip herhangi bir şeyde
ASCII-yalnızca

Alan için veya sonuç farklıdır hız için optimize derlenmiş olup olmadığını dışarı standart ise @ mümkün-yalnızca ASCII ... Ben bilmiyorum ...
RosLuP

2

PowerShell , 67 62 bayt

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

Çevrimiçi deneyin!

Temel olarak, Boolean değişkenlerinin string çarpma sürelerini kullanan bir FizzBuzz (dolaylı olarak 1 veya 0'a atılır). Bu dizeler boru hattında bırakılır ve tırnak işaretleri içinde bir komut dosyası bloğunda toplanır. $OutputFieldSeparatorBir dizi için varsayılan boşluklar olduğundan, bu örtük olarak bize alanla ayrılmış dizi öğeleri verir.


2

C #, 124 117 123 bayt

-5 byte Kevin Cruijssen sayesinde

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?"":" "));}

Şununla test et:

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();

C # baskısına bakıyorum. C #, tam sayıların üçlü bir operatöre sol argüman olarak izin veriyor mu, yoksa bir boole olmak zorunda mı?
Zacharı

C # hakkında fazla bir şey bilmiyorum, ama xonun yerine iendişe duymanıza gerek kalmadı int mı? (Tabii ki yine de ayarlamanız gerekir).
Zacharý

@ Zacharý Hayır, "Örtülü int'yi boolean'a dönüştüremiyorum" CS0029 hatası veriyor. Ve evet, kullanabiliyordum ive bunu 0'da başlatabildiğim gerçeğini Invoke. Fakat bu, t ( Action<int>) ve call ( t.Invoke(0)) bildirgesini bayt sayısına dahil etmek zorunda kalacağım anlamına gelmez mi?
HatsuPointerKun 10:18

Gibi bir şey x=>{for(x=0;x++<99;)Console.Write((x%3==0?"(":"")+(x%4==0?"[":"")+x+(x%4==0?"]":"")+(x%3==0?")":"")+(x%99==0?"":" "));};işe yarayacak mı diye soruyorum .
Zacharı

1
Beş ==0de olabilir <1.
Kevin Cruijssen


2

Ruby , 72 66 bayt

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

İlave kesim için @ jonathan-frech ve @ conor-obrien'e teşekkürler.


Merhaba ve PPCG'ye hoş geldiniz! 70 bayt .
Jonathan Frech

PPCG'ye Hoşgeldiniz! İşte @JonathanFrench'in önerisinden 4 bayt, 66 bayt için , çünkü a.join bbir dizi ave dize beşdeğerdira*b
Conor O'Brien

2

PowerShell, 98 82 74 67 63 62 bayt

@ ASCII-only @Veskah -5 bayt sayesinde bir kuyruklu -31 bayt sadece

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

Çevrimiçi deneyin!

Burada ne yaptığımdan hala emin değilim.


70 byte için sadece biraz hızlı golf . Bir dizge olarak $ a kullanmanız gerekmez ve "$a"yine de değerin yerine geçecektir. (Not: Tek tırnak işaretleri yerine geçmez $foo, sadece çift tırnak işaretleri koyar. Başka bir püf noktası ise eğer sadece 0 veya 1
değerine önem veriyorsa

Liste dizinlemeyi de kullanıyorsanız, 67 bayt .
Veskah




1

perl -E, 60 bayt

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

Sayılar arasında yeni satırlar kullanabilirsek, bazı baytlar kaydedilebilir: bu durumda, döngüyü taşırken, bir döngüye dönüşerek $,=$";değiştirebiliriz .mapforsay


1
Eğer misiniz Abigail? Mucidi ? /^1$|^(11+?)\1+$/
msh210

1
Vay. Seni burada görmek ne büyük şeref!
msh210

1

Perl 6 , 51 48 bayt

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

Çevrimiçi deneyin!


Ben listeleri ve dizi temsiller gibi arasındaki farkı kötüye gidiyordu bu , ama ben ... Bütün listeye etrafında çevreleyen parantez kurtulmak için nasıl emin değilim
Jo Kral

@JoKing Ben de bunu düşündüm, ama sadece bu 51-byter ile geldi .
nwellnhof

1

Toplu iş, 145 bayt

@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%

Kod alt yordamın içine girer, ancak kod bu nokta tarafından zaten basılmıştır, böylece kod zararsız bir şekilde çalışır.




1

sfk , 225 bayt

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

Çevrimiçi deneyin!


1

Bash, 61 bayt

-14 bayt, Dennis sayesinde

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

açıklama

Oldukça basit:

  • seq 1,.99 üretir
  • Bunu awkçıkış kayıt ayırıcısına koyarız (ORS ) boşluğa ayarlayarak böylece çıkış tek bir çizgi olur.
  • Ana awk gövdesi, sayı 4 ile bölünebiliyorsa sadece "[]" ekler, ardından bunun üzerine, 3 ile bölündüğünde "()" ekler.

Çevrimiçi deneyin!



1

PHP, 65 bayt

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

veya

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

(PHP 5.5 veya üstü sürüm gerektirir)

Çevrimiçi olarak koşun -nrveya deneyin .


1

Python 2,78 bayt

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

Çevrimiçi deneyin!

Bu harika yaklaşım dilimlemeyi planladım '([%0d])' ancak ifadeleri daha kısa sürede elde edemiyorum.


1

Java 8, 92 91 bayt

@Dana sayesinde -1 bayt

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

Çevrimiçi deneyin!

Alternatif çözüm, 82 bayt (çıktıda boşluk bırakıyor - izin verilip verilmediğinden emin değilsiniz):

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

Açıklama:

for(;i++<99;) - a'nın değerinden geçen bir for i (giriş olarak yeniden kullanılır, bu durumda 0 olarak alınır) 99

out.printf(<part1>+<part2>,i); - dizgiyi hemen basmadan önce stdout değerine çevirir i

nerede <part1>olduğunu (i>1?" ":"")- boşluk yazdırır önce numarayı baskı sürece bu boşluk atlar bu durumda bu sayı 1'dir,

ve <part2>bir (i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i)- eğer i3 ve 4 'de bölünemeyen, ikare ve çevresindeki yuvarlak parantez olmaktadır; Aksi takdirde i3'e bölünebilirse iyuvarlak köşeli ayraçlara sahiptir; Eğer başka bir i4 ile bölünebilir, iköşeli parantezler sahiptir; başka, iparantez yok.


Alanı her döngü yinelemenin başına getirerek bir bayt kazanın(i>1:" ":"")
dana

Ben ters sonucu (bkz baskılı eğer o olur sadece iş bu ) ama olur aslında kazanç 2 byte yerine 1.
NotBaal

Maalesef, bu soruya göre beklenen çıktıyla aynı değil, ancak öneri için teşekkür ederim!
NotBaal

1
"Çevrimiçi deneyin" bağlantıları kopmuş görünüyor. Düşünüyordum i->{for(;i++<99;)out.printf((i>1?" ":"")+(i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i),i);}mu
dana

1
Ohhhh haklısın, işe yarıyor! Bunun için teşekkürler!
NotBaal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.