Multiplizitätstest


21

Verwenden Sie eine beliebige Programmiersprache, um Zahlen zwischen 1 und 99 (einschließlich beider) so anzuzeigen, dass:

  • Die Zahlen sind durch ein einzelnes Leerzeichen getrennt.
  • Wenn eine Zahl durch 3 teilbar ist, sollte sie in Klammern stehen.
  • Wenn eine Zahl durch 4 teilbar ist, sollte sie in eckigen Klammern stehen.
  • Wenn eine Zahl sowohl durch 3 als auch durch 4 teilbar ist, sollte sie sowohl in Klammern als auch in eckigen Klammern angegeben werden (wobei eckige Klammern näher an der Zahl stehen).

Ihr Programm sollte genau anzeigen:

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
Können wir jeden Eintrag in einer neuen Zeile ausgeben, oder muss die Ausgabe nur in einer Zeile erfolgen?
ETHproductions

4
Kann die Ausgabe mit einem Leerzeichen enden? Einige Antworten scheinen dies anzunehmen.
Dennis

Antworten:





4

Jelly , 21 bis 20 Bytes

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

Probieren Sie es online!

Wie es funktioniert

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

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

Probieren Sie es online!

Portiert von der C ++ - Antwort von @ HatsuPointerKun.


3

Kohle , 30 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

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

1 Byte weniger dank @Jonah

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

Probieren Sie es online!


Danke, dass du das gemacht hast. Und warum musst du das stdouthier tun ? Das habe ich noch nie gesehen. @ FrownyFrog
Jonah

@Jonah Ich kann es nicht als vollständige Zeichenfolge ausgeben, es wird abgeschnitten (...) Stdout macht das nicht und es wird auch keine neue Zeile gedruckt, daher kann ich auch jede Zahl einzeln drucken. Aus irgendeinem Grund erscheinen nachgestellte Leerzeichen (es gibt 4, und nur 1 ist absichtlich da)
FrownyFrog

Dieser Ansatz ist wirklich clever, sowohl was die Rotation als auch die Wahl betrifft #. Ich hatte ein Hilfsverb umgebend mit eingeführt ()und []: g=. {.@[ , ":@] , {:@[. ugh die Ausführlichkeit!
Jonah

noch eine frage: irgendeinen grund, den du LFanstelle von benutzt hast _. Letzteres scheint auch zu funktionieren.
Jonah

3

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

-5 Bytes dank Zacharý und inspiriert durch write () - Funktion in D-Sprache (siehe Zacharý-Antwort)

-2 Bytes dank mriklojn

-12 Bytes für die C-Version dank mriklojn

-4 Bytes dank 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 Spezifische Optimierung: 115 Bytes

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

Lässt MSVC Sie das inf f()Ding machen? Entschuldigen Sie das Löschen meiner Kommentare, ich dachte, ich hätte etwas
Kürzeres

@ Zacharý Nein, ich denke, die Funktion ist zu einfach und erzeugt ein "f muss ein int zurückgeben". Übrigens war Ihre Lösung 3 Bytes kürzer (einschließlich Komprimierung gepaart mit dem Verschieben der Inkrementierung von i)
HatsuPointerKun

1
Verdammt, völlig vergessen printfwar eine Sache. Könnten Sie das C stdio dann nicht benutzen?
Zacharý

2
Eine andere Sache, die Sie verwenden / ausnutzen könnten, ist die Tatsache, dass Sie, zumindest mit gcc 5.3.1, das # include nicht benötigen und den Rückgabetyp der Funktion auch entfernen können. Wenn Sie int idie Funktion als außerhalb deklarieren (im globalen Bereich), ist ihr Wert standardmäßig 0 und ihr Datentyp standardmäßig 0 int. Dies würde dazu führen, dass Ihre Schleife bei 0 beginnt. i;f(){for(;++i<=99;)
Um dies zu korrigieren,

1
Schlagen Sie ")\0"+i%3statt i%3?"":")". Außerdem denke ich, dass Sie i=0am Anfang der Schleife hinzufügen müssen .
Ceilingcat

3

Powershell, 60 Bytes

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

Erläuterung:

  • das Array mit 4 Elementen: $_, "($_)", "[$_]", "([$_])"
  • und der Index: [!($_%3)+2*!($_%4)]
  • Wiederholen Sie dies für jede Nummer
  • konvertiere das Ergebnis in einen String

Weniger Golf-Testskript:

$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

Ausgabe:

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 Bytes

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

HINWEIS: Es ist ein Leerzeichen vorhanden

Nur meine zweite MathGolf Antwort ..
-5 Bytes dank @JoKing .

Probieren Sie es online aus.

Erläuterung:

♀(             # 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 Danke! Wusste nicht, dass das qweggelassen werden kann und es wird implizit in Schleifen ausgeführt. Wusste auch nicht, dass eine 2/3/4 Saite eingebaut ist. Schade, dass der Drehtrick mit dem umschlossenen Array nicht funktioniert.
Kevin Cruijssen

Nun, es ist mehr so, dass ich die explizite Ausgabe jeder Iteration gegen implizite Ausgabe am Ende des Programms eingetauscht habe
Jo King,

@JoKing Ja, aber ich wusste nicht, dass es den gesamten zusammengefügten Stapel ausgeben würde, anstatt nur den oberen. :)
Kevin Cruijssen

Meine Lösung näherte sich 40 Bytes, obwohl ich falsch verstanden habe und dachte, dass geschweifte Klammern anstelle von eckigen Klammern verwendet werden sollten. Gute Arbeit an der Lösung!
Maximal


2

Lua, 161 123 Bytes

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)

Probieren Sie es online!

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 Bytes

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

Am Anfang jeder "Klammerzeichenfolge" steht ein Nullbyte.

Probieren Sie es online!


Und in "(" + i% 3, woher weißt du, dass die Adresse für i = 2 auf einen
Zeichenwert von

Es funktioniert mit gcc, was gut genug ist, da PPCG Sprachen durch ihre Implementierungen definiert.
Dennis

Ich denke, man kann nicht sagen, dass der Code in jeder Implementierung des GCC-Compilers in
Ordnung

@RosLuP gcc funktioniert auf den meisten Computern jedoch auf die gleiche Weise, zumindest auf allen Computern mit der gleichen Architektur
ASCII

@ ASCII-nur möglich, wenn für Speicherplatz oder Geschwindigkeit optimiert kompiliert das Ergebnis ist anders ... Ich weiß nicht, ob es aus dem Standard ist ...
RosLuP

2

PowerShell , 67 62 Bytes

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

Probieren Sie es online!

Grundsätzlich ein FizzBuzz mit String-Multiplikationszeiten Boolescher Variablen (implizit auf 1 oder 0 umgewandelt). Diese Zeichenfolgen verbleiben in der Pipeline und werden in Anführungszeichen in einem Skriptblock zusammengefasst. Da die Standardeinstellung $OutputFieldSeparatorfür ein Array Leerzeichen ist, erhalten wir implizit durch Leerzeichen getrennte Array-Elemente.


2

C #, 124 117 123 Bytes

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

Testen Sie mit:

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

In den Vorstoß von C #, verstehe ich. Lässt C # Ganzzahlen als linkes Argument für einen ternären Operator zu, oder muss es ein Boolescher Wert sein?
Zacharý

Ich weiß nicht viel über C #, aber könnten Sie xstattdessen verwenden i, um sich keine Sorgen über das zu machen int ? (Sie müssten es natürlich noch einstellen).
Zacharý

@ Zacharý Nein, es wird ein CS0029-Fehler generiert "Kann nicht implizit int in boolean konvertieren". Und ja, ich könnte iund die Tatsache, dass ich es bei 0 initialisieren kann, wenn ich Invoke. Aber würde das nicht bedeuten, dass ich die Deklaration von t ( Action<int>) und den Aufruf ( t.Invoke(0)) in das bytecount aufnehmen müsste?
HatsuPointerKun

Ich frage, ob so etwas x=>{for(x=0;x++<99;)Console.Write((x%3==0?"(":"")+(x%4==0?"[":"")+x+(x%4==0?"]":"")+(x%3==0?")":"")+(x%99==0?"":" "));};funktionieren würde.
Zacharý

1
Alle fünf ==0können sein <1.
Kevin Cruijssen


2

Ruby , 72 66 Bytes

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

Danke an @ jonathan-frech und @ conor-obrien für den zusätzlichen Zuschnitt.


Hallo und willkommen bei PPCG! 70 Bytes .
Jonathan Frech

Willkommen bei PPCG! Hier ist ein weiteres 4 Bytes aus der @JonathanFrench ‚s Vorschlag, für 66 Bytes , da a.join bfür eine Reihe aund Zeichenfolge bentsprichta*b
Conor O'Brien

2

PowerShell, 98 82 74 67 63 62 Byte

Satte -31 Bytes dank @Veskah -5 Bytes dank @ ASCII-only

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

Probieren Sie es online!

Ich bin mir immer noch nicht ganz sicher, was ich hier gemacht habe.


Nur ein bisschen schnelles Golfen für 70 Bytes . Sie müssen $ a nicht als Zeichenfolge verwenden und "$a"ersetzen den Wert trotzdem. (Hinweis: Einfache Anführungszeichen ersetzen nicht $foo, nur doppelte Anführungszeichen). Ein weiterer Trick ist, wenn es nur um 0 oder 1 geht, sodass Sie mit Boolescher Logik ein Byte speichern können
Veskah,

67 Bytes, wenn Sie auch die Listenindizierung verwenden.
Veskah




1

Perl -E, 60 Bytes

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

Einige Bytes können gespeichert werden, wenn wir Zeilenumbrüche zwischen den Zahlen verwenden können. In diesem Fall können wir das entfernen $,=$";, das mapin eine forSchleife umwandeln und das sayin die Schleife verschieben.


1
Bist du die Abigail? Erfinder von /^1$|^(11+?)\1+$/?
msh210

1
Wow. Was für eine Ehre, Sie hier zu haben!
msh210


1

Batch, 145 Bytes

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

Der Code fällt in die Unterroutine, aber die Zeichenfolge wurde zu diesem Zeitpunkt bereits gedruckt, sodass der Code harmlos ausgeführt wird.




1

sfk , 225 bytes

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

Probieren Sie es online!


1

Bash, 61 Bytes

-14 Bytes, danke an Dennis

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

Erläuterung

Ziemlich einfach:

  • seq produziert 1..99
  • wir leiten das awkmit dem Output Record Separator (ORS ) ein, der auf Leerzeichen gesetzt ist, so dass die Ausgabe eine einzelne Zeile ist.
  • Der Hauptkörper von awk fügt nur "[]" hinzu, wenn die Zahl durch 4 teilbar ist, und fügt dann zusätzlich "()" hinzu, wenn die Zahl durch 3 teilbar ist.

Probieren Sie es online!



1

PHP, 65 Bytes

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

oder

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

(benötigt PHP 5.5 oder neuer)

Laufen Sie mit -nroder versuchen Sie es online .


1

Python 2 , 78 Bytes

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

Probieren Sie es online!

Ich habe mir diesen coolen Ansatz vorgestellt, '([%0d])'aber ich kann die Ausdrücke nicht kürzer fassen.


1

Java 8, 92 91 Bytes

-1 Byte danke an @Dana

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

Probieren Sie es online!

Alternative Lösung, 82 Byte (mit nachfolgendem Speicherplatz in der Ausgabe - nicht sicher, ob dies zulässig ist):

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

Erläuterung:

for(;i++<99;) - eine for-Schleife, die vom Wert von geht i (in diesem Fall 0) bis 99 reicht

out.printf(<part1>+<part2>,i); - formatiert den String, bevor er sofort mit dem Wert von stdout gedruckt wird i

wo <part1>ist (i>1?" ":"")- druckt das Leerzeichen aus, bevor die Nummer gedruckt wird, sofern nicht , diese Zahl ist 1. In diesem Fall wird das Leerzeichen weggelassen

und <part2>ist (i%12<1?"([%d])":i%3<1?"(%d)":i%4<1?"[%d]":i)- wenn idurch 3 und 4 teilbar ist, isind eckige und runde Klammern um ihn herum; sonst wenn idurch 3 teilbar, ihat runde Klammern; sonst wenn idurch 4 teilbar, ihat eckige Klammern; sonst ihat keine Klammern.


Speichern Sie ein Byte, indem Sie das Leerzeichen an den Anfang jeder Schleifeniteration verschieben(i>1:" ":"")
Dana,

Das würde nur funktionieren, wenn ich das Ergebnis in umgekehrter Reihenfolge ausdrucken würde (siehe dies ), aber tatsächlich 2 Bytes anstelle von 1
einsparen

Leider stimmt das nicht mit der erwarteten Ausgabe gemäß Frage überein, aber trotzdem vielen Dank für den Vorschlag!
NotBaal

1
Die "online testen" Links scheinen defekt zu sein. Ich habe nachgedacht 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 du hast recht, das funktioniert! Dank dafür!
NotBaal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.