Hintergrund
Als ich in der Grundschule war, haben wir ein Mathe-Spiel gespielt, das wie folgt aussieht.
Alle Kinder sitzen in einem großen Kreis und wechseln sich ab, beginnend mit 1 .
Die folgenden Zahlen müssen jedoch beim Zählen übersprungen werden:
- Zahlen, die ein Vielfaches von 3 sind .
- Zahlen, deren Dezimalzahl eine 3 enthält .
Die ersten 15 Zahlen, die die Kinder sagen sollten, sind
1 2 4 5 7 8 10 11 14 16 17 19 20 22 25
Wenn jemand eine falsche Nummer hat - eine Nummer sagt, die nicht in der Sequenz enthalten ist, oder eine andere überspringt - wird er aus dem Kreis entfernt. Das geht so lange, bis nur noch ein Kind übrig ist.
Aufgabe
Du bist schlecht in diesem Spiel, also entscheidest du dich zu betrügen. Schreiben Sie ein Programm oder eine Funktion, die bei gegebener Nummer der Sequenz die nächste Nummer der Sequenz berechnet.
Sie müssen keine Zahlen verarbeiten, die mit dem systemeigenen numerischen Typ Ihrer Sprache nicht dargestellt werden können, sofern Ihr Programm bis zur Eingabe 251 ordnungsgemäß funktioniert und Ihr Algorithmus für beliebig große Eingaben funktioniert.
Ein- und Ausgabe können auf jeder beliebigen Basis erfolgen.
Da Sie Ihren Code verbergen müssen, muss er so kurz wie möglich sein. In der Tat ist dies Code-Golf , so dass der kürzeste Code in Bytes gewinnt.
Testfälle
1 -> 2
2 -> 4
11 -> 14
22 -> 25
29 -> 40
251 -> 254
quelle
7
übersprungen, wenn ich es spielte, aber Sie würden stattdessen etwas anderes sagen, anstatt zur nächsten Nummer in der Schlange zu gehen.Antworten:
Brachylog , 10 Bytes
Probieren Sie es online!
Erläuterung
quelle
JavaScript (ES6), 30 Byte
quelle
J, 24 Bytes
Unkomplizierter Ansatz, der von Eingabe n aus nur vorwärts iteriert, bis die nächste nach den Regeln gültige Zahl gefunden wird.
Formen fünf Smileys,
$:
,:)
,0=
,=|
, und>:
.Verwendungszweck
Erläuterung
quelle
Python 2,
73 6643 BytesVielen Dank an xnor, der mir gesagt hat, dass ich durch die Verwendung von 2 Variablen dumm bin, und auch an Mitch Schwartz.
quelle
x=input()+1
while'3'[:x%3]in`x`:x+=1
print x
.x=~input()
, Subtrahieren statt Addieren und Drucken-x
.05AB1E , 11 Bytes
Probieren Sie es online!
Erläuterung
quelle
Perl, 19 Bytes
18 Byte Code + 1 für
-p
.Verwendungszweck
quelle
Java 8,
57565550 BytesDanke an @Numberknot für 1 Byte Danke an @Kevin Cruijssen für 5 Byte
Das ist ein
Function<Integer, Integer>
Erläuterung
Naive Implementierung, die einfach inkrementiert, bis eine akzeptable Anzahl erreicht ist.
Testklasse
Ausgabe der Testklasse:
quelle
|
anstelle von||
do-while
? Nur eine reguläre for-Schleife ist kürzer:i->{for(;++i%3<1|(i+"").contains("3"););return i;}
( 50 Bytes )while
und zu vergleichendo-while
, und beide gaben mir die gleiche Punktzahl, aber ich mochte die Art und Weise , wie siedo-while
aussah ... Ich habe nicht daran gedacht, einefor
Schleife zu verwenden ... Danke!Japt, 18 Bytes
Testen Sie es online
Ich habe endlich eine Chance zu nutzen
ß
:-)Wie es funktioniert
quelle
PowerShell v2 +, 46 Byte
Nimmt Eingaben auf
$args[0]
, fügt hinzu1
, speichert in$a
, startet einefor
Schleife. Die Bedingung hält die Schleife am Laufen, während entweder$a-match3
(Regex-Übereinstimmung)-or
$a%3
Null ist (die!
davon ist1
). Die Schleife wird einfach inkrementiert$a++
. Am Ende der Schleife platzieren wir sie einfach$a
in der Pipeline und geben sie implizitWrite-Output
nach Abschluss des Programms aus.Beispiele
quelle
R, 46 Bytes
quelle
n
statt habencat(n)
.Python 2,
494442 BytesDer andere Python-Eintrag schlägt dies (edit: nicht mehr :-D), aber ich habe es gepostet, weil ich seinen rekursiven Ansatz eher mag. Vielen Dank an Mitch Schwarz und Erik the Golfer, die mir geholfen haben, das Ganze zu verkürzen.
quelle
f=lambda x:f(x+1)if x%3>1or'3'in`x+1`else-~x
. Wenn Sie Python 3 halten möchten, können Sie Golf spielen das letztex+1
zu-~x
und den Raum entfernen.f=lambda x:'3'[:~x%3]in`~x`and f(x+1)or-~x
undf=lambda x:f(x+1)if'3'[:~x%3]in`~x`else-~x
Lua, 58 Bytes
quelle
Pyke, 13 Bytes
Probieren Sie es hier aus!
quelle
while
am Anfang gesagt .C #,
56, 51 Bytes.Dies ist überraschend kurz für eine C # Antwort!
quelle
t=x=>(++x)%3<1|(x+"").Contains("3")?t(x):x;
In Visual Studio, brauchen Sie nur die Variable zu definieren und auf null gesetztFunc<int, int> t = null;
und dann die rekursive Funktion auf der folgenden Zeile definieren.Haskell,
5048 BytesProbieren Sie es auf Ideone. 2 Bytes dank @Charlie Harding gespart .
Alternative: (50 Bytes)
quelle
until(\x->mod x 3>0&¬Elem '3'(show x))succ.succ
.Pyth, 11 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung:
quelle
GolfSharp , 43 Bytes
quelle
Ruby, 47 Bytes
Ich habe wirklich das Gefühl, dass man weiter Golf spielen kann.
quelle
i
anstelle von"#{i}"
MATL , 14 Bytes
Probieren Sie es online!
Erläuterung
quelle
Labyrinth ,
117102 BytesProbieren Sie es online!
Labyrinth ist eine zweidimensionale, stapelbasierte Programmiersprache und an Kreuzungen wird die Richtung durch die Oberseite des Stapels bestimmt (Positiv geht nach rechts, Negativ geht nach links, Null geht geradeaus). In diesem Programm gibt es zwei Hauptschleifen. Der erste modifiziert die Ganzzahleingabe um 3 und erhöht sie um 0. Der zweite prüft wiederholt, ob die letzte Ziffer 3 ist (indem er 3 subtrahiert und durch 10 modifiziert) und dividiert dann durch 10, um eine neue letzte Ziffer zu erhalten.
quelle
PHP,
60555446 BytesVielen Dank an @ user59178 für das Abschneiden einiger Bytes, @AlexHowansky für ein Byte und @Titus für ein paar weitere Bytes
Wird von der Kommandozeile mit aufgerufen
-r
. Naive Methode, die eine Schleife ausführt, während die Zahl ein Vielfaches von 3 ist oder 3 Ziffern enthält.quelle
for($i=$argv[1];!(++$i%3)|strpos(" $i",'3'););echo$i;
vornimmt. Möglicherweise können Sie bessere Ergebnisse erzielen, indem$i
Sie das Programm gleichzeitig zuweisen .strpos(_.$i,'3')
%3<1
, eines mit51
anstelle von'3'
, zwei weitere mitstrstr($i)
anstelle vonstrpos(_.$i)
und zwei weitere durch Vertauschen der|
Operanden in der zweiten Version:<?for(;strstr($i=++$argv[1],51)|$i%3<1;);echo$i;
-> 48 BytesPHP,
4741 Bytesinspiriert von Xanderhall , aber die neueste Idee rechtfertigt endlich eine eigene Antwort.
oder
Dies macht sich die Tatsache zunutze, dass die Eingabe auch aus der Sequenz stammt: Denn
$n%3==1
das neue Modulo ist2
. Denn$n%3==2
das neue Modulo ist4-3=1
.$n%3==0
passiert nie.Laufen Sie als Pipe mit
-R
oder probieren Sie sie online aus .quelle
APL (Dyalog Unicode) ,
33282719 Byte SBCSProbieren Sie es online!
-6 danke an Adám. -8 danke an ngn.
Alte Erklärung:
APL (Dyalog Extended) ,
23SBCS mit 17 BytesProbieren Sie es online!
Vielen Dank an Adám. -6 danke an ngn.
Alte Erklärung:
quelle
Perl 6 ,
27 2524 BytesProbieren Sie es online!
Findet die erste Zahl größer ist als der Eingang, der keine drei hat und hat einen Rest , wenn moduloed von 3. Ich habe gehofft , etwas Phantasie mit der Bedingung zu tun, wie ,
!/3/&*%3
aber es funktioniert nicht mit dem!
.:(
Erläuterung:
quelle
C 81 Bytes
quelle
Netz, 30 Bytes
Probieren Sie es online!
Erläuterung
1: Initialisierung
Dies wandelt den
i
nput in einen
umber um und geht dann down (v
)2: Schleife
3: endgültig
quelle
Batch, 93 Bytes
Übernimmt die Eingabe für STDIN.
quelle
CJam, 19 Bytes
ONLINE
Erläuterung:
Wenn eine weniger ausführliche Erklärung gefragt worden wäre, hätte ich das getan:
quelle
Pyth, 19 Bytes
Testsuite
Ich bin sicher, dass ich das Golf spielen kann ... es ist das gleiche wie meine CJam-Antwort.
Erläuterung:
quelle
J
. Sie können inkrementierenQ
. Und wenn Sie es clever machen, können Sie die Operation in die while-BedingungW|!%=hQ3/
einbinden : Q \ 3; Q`.W|!%=hQ3/`Q\3;Q
Clojure, 73 Bytes
Durchläuft rekursiv eine Schleife, während
n
durch 3 teilbar ist oder eine 3 in der Zeichenfolgendarstellung enthält. Obwohl ich eine nicht optimierte Rekursion verwende, konnte sie 2999999 als Eingabe verarbeiten, daher sollte dies in Ordnung sein.Ungolfed
quelle