Zähle ohne 3


45

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 , so dass der kürzeste Code in Bytes gewinnt.

Testfälle

  1 ->   2
  2 ->   4
 11 ->  14
 22 ->  25
 29 ->  40
251 -> 254

5
Ich habe das Gefühl, wir hatten eine Herausforderung wie diese ...
Conor O'Brien

5
Es wurde immer 7übersprungen, wenn ich es spielte, aber Sie würden stattdessen etwas anderes sagen, anstatt zur nächsten Nummer in der Schlange zu gehen.
mbomb007

12
@ mbomb007: Als ich es gespielt habe, wurdest du nicht aus dem Kreis entfernt. Stattdessen würden Sie trinken. Aber das war nicht in der Grundschule. Jedenfalls war es fast unmöglich, über 80 zu werden, besonders nach der ersten Stunde.
Tomasz

10

4
@ mbomb007: Das würde vom Beweis abhängen, was du trinkst.
Tomasz

Antworten:


21

Brachylog , 10 Bytes

<.='e3:I'*

Probieren Sie es online!

Erläuterung

(?)<.                Output > Input
    .=               Assign a value to the Output
    . 'e3            3 cannot be an element of the Output (i.e. one of its digits)
        3:I'*(.)     There is no I such that 3*I = Output

3
Antworten wie diese sind so schön in Brachylog :)
Emigna

3
@Emigna Es fühlt sich manchmal fast nicht golfen genug an, weil es im Grunde die Herausforderung direkt beschreibt. Das ist der Fall für viele Antworten in dieser Sprache :)
Fatalize

14

JavaScript (ES6), 30 Byte

f=n=>++n%3*!/3/.test(n)?n:f(n)

Sowohl Index 2 als auch Index 3 geben die Nummer 4 mit dieser Funktion zurück
nl-x

1
@ nl-x Ja, da 4 die nächste Zahl in der Sequenz nach 2 und 3 ist. Sie ist nicht indiziert. Es ist einfach die nächste Nummer in der Sequenz.
ETHproductions

Ich glaube, ich beginne es zu verstehen ... Mein schlechtes
nl-x

8

J, 24 Bytes

3(]0&({$:)~e.&":+.0=|)>:

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

   f =: 3(]0&({$:)~e.&":+.0=|)>:
   (,.f"0) 1 2 11 22 29 251
  1   2
  2   4
 11  14
 22  25
 29  40
251 254

Erläuterung

3(]0&({$:)~e.&":+.0=|)>:  Input: integer n
                      >:  Increment n
3                         The constant 3
 (                   )    Operate dyadically with 3 (LHS) and n+1 (RHS)
                    |       Take (n+1) mod 3
                  0=        Test if equal to 0
             &":            Format both 3 and n+1 as a string
           e.               Test if it contains '3' in str(n+1)
                +.          Logical OR the results from those two tests
  ]                         Right identity, gets n+1
   0&(   )~                 If the result from logical OR is true
       $:                     Call recursively on n+1
      {                       Return that as the result
                            Else act as identity function and return n+1

Nun, J ist wahrscheinlich die Programmiersprache, die am meisten zu Smileys neigt.
Adám

8

Python 2, 73 66 43 Bytes

Vielen Dank an xnor, der mir gesagt hat, dass ich durch die Verwendung von 2 Variablen dumm bin, und auch an Mitch Schwartz.

x=~input()
while'3'[:x%3]in`x`:x-=1
print-x

1
Die Aktualisierung mit zwei Variablen sieht viel zu kompliziert aus. Ich denke, du brauchst nur x=input()+1 while'3'[:x%3]in`x`:x+=1 print x.
Xnor

@xnor, oh yeah albern ich weiß nicht warum ich das getan habe
Daniel

Ein-Byte-Verbesserung durch Starten x=~input(), Subtrahieren statt Addieren und Drucken -x.
Mitch Schwartz

1
@Artyer Das ist nur einer der drei Fehler, die in dieser Bearbeitung enthalten sind.
Mitch Schwartz

1
@Dopapp Die aktuelle Revision (ohne Leerzeichen) ist 43 Bytes? mothereff.in/…
Artyer

7

05AB1E , 11 Bytes

[>Ð3ås3Ö~_#

Probieren Sie es online!

Erläuterung

               # implicit input
[              # start loop
 >             # increase current number
  Ð            # triplicate
          #    # break loop IF
         _     # logical negation of
   3å          # number has one or more 3's in it
        ~      # OR
     s3Ö       # number % 3 == 0

7

Perl, 19 Bytes

18 Byte Code + 1 für -p.

++$_%3&&!/3/||redo

Verwendungszweck

perl -pe '++$_%3&&!/3/||redo' <<< 8
10

perl -pe '++$_%3&&!/3/||redo' <<< 11
14

1
@ dan1111 Es ist Perl, was hast du erwartet? Klarheit?
Erik der Outgolfer

1
@EriktheGolfer was? Dies ist die eigentliche Definition von "selbstdokumentierendem Code".

@ dan1111 Du kennst wohl Perl. Ich habe keine Ahnung, wie Perl funktioniert, wegen seiner berühmten Verrücktheit.
Erik der Outgolfer

@ dan1111 Danke! Sehr glücklich darüber, wie kurz es ausgefallen ist!
Dom Hastings

1
@DomHastings Nun, in PPCG nehmen wir Perl als oberste Ebene der Verrücktheit und Jelly / Actually / O5AB1E als oberste Ebene der Unordnung. Es scheint, dass Sie diese Herausforderung noch nie gesehen haben :)
Erik the Outgolfer

6

Java 8, 57 56 55 50 Bytes

Danke an @Numberknot für 1 Byte Danke an @Kevin Cruijssen für 5 Byte

i->{for(;++i%3<1|(i+"").contains("3"););return i;}

Das ist ein Function<Integer, Integer>

Erläuterung

Naive Implementierung, die einfach inkrementiert, bis eine akzeptable Anzahl erreicht ist.

Testklasse

public class CodeGolf {

    public static void main(String[] args) {
        Function<Integer, Integer> countingGame = i->{for(;++i%3<1|(i+"").contains("3"););return i;};
        int val = 1;
        for (int i = 0; i < 10; i++) {
            System.out.print(val + " ");
            val = countingGame.apply(val);
        }
    }

}

Ausgabe der Testklasse:

1 2 4 5 7 8 10 11 14 16

2
Sie können |anstelle von||
Numberknot

1
@Numberknot Ich hatte keine Ahnung, dass bitweise Operatoren in manchen Kontexten als logische Operatoren fungieren! Vielen Dank!
Socratic Phoenix

1
Warum das do-while? Nur eine reguläre for-Schleife ist kürzer: i->{for(;++i%3<1|(i+"").contains("3"););return i;}( 50 Bytes )
Kevin Cruijssen

@KevinCruijssen Nun ... Ich habe darüber nachgedacht, whileund zu vergleichen do-while, und beide gaben mir die gleiche Punktzahl, aber ich mochte die Art und Weise , wie sie do-whileaussah ... Ich habe nicht daran gedacht, eine forSchleife zu verwenden ... Danke!
Socratic Phoenix

5

Japt, 18 Bytes

°U%3*!Us f'3 ?U:ßU

Testen Sie es online

Ich habe endlich eine Chance zu nutzen ß:-)

Wie es funktioniert

                    // Implicit: U = input integer
°U%3                // Increment U, and take its modulo by 3.
     !Us f'3        // Take all matches of /3/ in the number, then take logical NOT.
                    // This returns true if the number does not contain a 3.
    *               // Multiply. Returns 0 if U%3 === 0  or the number contains a 3.
             ?U     // If this is truthy (non-zero), return U.
               :ßU  // Otherwise, return the result of running the program again on U.
                    // Implicit: output last expression

5

PowerShell v2 +, 46 Byte

for($a=$args[0]+1;$a-match3-or!($a%3)){$a++}$a

Nimmt Eingaben auf $args[0], fügt hinzu 1, speichert in $a, startet eine forSchleife. Die Bedingung hält die Schleife am Laufen, während entweder $a-match3(Regex-Übereinstimmung) -or $a%3Null ist (die !davon ist 1). Die Schleife wird einfach inkrementiert $a++. Am Ende der Schleife platzieren wir sie einfach $ain der Pipeline und geben sie implizit Write-Outputnach Abschluss des Programms aus.

Beispiele

PS C:\Tools\Scripts\golfing> 1,2,11,22,29,33,102,251,254|%{"$_ --> "+(.\count-without-three.ps1 $_)}
1 --> 2
2 --> 4
11 --> 14
22 --> 25
29 --> 40
33 --> 40
102 --> 104
251 --> 254
254 --> 256

4

R, 46 Bytes

n=scan()+1;while(!n%%3|grepl(3,n))n=n+1;cat(n)

Ich denke, dass die Rückgabe eines Wertes (anstatt zu stdout zu drucken) erlaubt ist, so dass Sie 5 Bytes einsparen können, indem Sie nur nstatt haben cat(n).
Rturnbull

4

Python 2, 49 44 42 Bytes

f=lambda x:'3'[:~x%3]in`~x`and f(x+1)or-~x

Der 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.


1
Sie können dies in Python 2: 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 letzte x+1zu -~xund den Raum entfernen.
Erik der Outgolfer

@EriktheGolfer Danke! Ich werde es in Python 2 ändern, da es viel kürzer ist.
0WJYxW9FMN

42s: f=lambda x:'3'[:~x%3]in`~x`and f(x+1)or-~xundf=lambda x:f(x+1)if'3'[:~x%3]in`~x`else-~x
Mitch Schwartz

3

Lua, 58 Bytes

i=...+1while(i%3==0or(i..""):find"3")do i=i+1 end print(i)

3

Pyke, 13 Bytes

Whii3%!3`i`{|

Probieren Sie es hier aus!

              - i = input
W             - do:
 hi           -  i += 1
   i3%!       -    not (i % 3)
            | -   ^ or V
       3`i`{  -    "3" in str(i)
              - while ^

1
Zuerst habe ich das aber whileam Anfang gesagt .
Conor O'Brien

Wenn Sie einen Blick darauf werfen, kann ich das sehen
Blue

3

C #, 56 , 51 Bytes.

Dies ist überraschend kurz für eine C # Antwort!

x=>{while(++x%3<1|(x+"").Contains("3"));return x;};

Sie können es auf 43 runter , wenn Sie es rekursiv zu machen : t=x=>(++x)%3<1|(x+"").Contains("3")?t(x):x; In Visual Studio, brauchen Sie nur die Variable zu definieren und auf null gesetzt Func<int, int> t = null;und dann die rekursive Funktion auf der folgenden Zeile definieren.
Grax32

Das Problem ist, dass ich, wenn ich es rekursiv mache, die Funktions- und Typdefinitionen zählen muss.
Morgan Thrapp

Kann ich diese Richtlinien irgendwo einsehen? Ich finde C # Golfen hier verwirrend.
Grax32

@Grax Grundsätzlich müssen Sie Code einfügen, der für die Ausführung des Codes erforderlich ist, mit Ausnahme der Zuweisung zu einem Namen im Fall einer nicht rekursiven Funktion. Ich weiß leider nicht, wo Sie konkrete Richtlinien finden würden.
Morgan Thrapp

@ MorganThrapp überprüfen Sie bitte meine c # Antwort mit Rekursion bei 49 Bytes :)
Lee


3

Pyth, 11 Bytes

f&-I`T3%T3h

Probieren Sie es online aus: Demo oder Test Suite

Erläuterung:

f&-I`T3%T3hQ   implicit Q at the end
f         hQ   find the smallest integer T >= input + 1 which fulfills:
  -I`T3           T is invariant under removing the digit 3
 &                and
       %T3        T mod 3 leaves a positive remainder


2

Ruby, 47 Bytes

i=gets.to_i;i while(i+=1)%3==0||"#{i}"=~/3/;p i

Ich habe wirklich das Gefühl, dass man weiter Golf spielen kann.


Sie können ianstelle von"#{i}"
Mhmd

2

MATL , 14 Bytes

`Qtt3\wV51-hA~

Probieren Sie es online!

Erläuterung

`       % Do...while
  Q     %   Add 1. Takes input implicitly in the first iteration
  tt    %   Duplicate twice
  3\    %   Modulo 3
  wV    %   Swap, string representation
  51-   %   Subtract 51, which is ASCII for '3'
  h     %   Concatenate
  A~    %   True if any result was 0. That indicates that the number
        %   was a multiple of 3 or had some '3' digit; and thus a 
        %   new iteration is needed

2

Labyrinth , 117 102 Bytes

?       """""""""""_
):_3    (         0/{!@
;  %;:}_';:_3-_10 1
"  1            %;_
""""_""""""""{;;'

Probieren 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.


2

PHP, 60 55 54 46 Bytes

Vielen Dank an @ user59178 für das Abschneiden einiger Bytes, @AlexHowansky für ein Byte und @Titus für ein paar weitere Bytes

for(;strstr($i=++$argv[1],51)|$i%3<1;);echo$i;

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.


1
Sie können 7 Bytes einsparen, indem Sie nur ein Programm verwenden, das Eingaben über die Befehlszeile und nicht über eine Funktion for($i=$argv[1];!(++$i%3)|strpos(" $i",'3'););echo$i;vornimmt. Möglicherweise können Sie bessere Ergebnisse erzielen, indem $iSie das Programm gleichzeitig zuweisen .
user59178

@ user59178 Ich nahm an, dass die Funktion $ i
Xanderhall

Die meisten Fragen sind ziemlich flexibel in der Art und Weise, wie Input und Output erfolgen, solange das Richtige gegeben und empfangen wird. Außerdem wählen die meisten, die Antworten in anderen Sprachen lesen, das Drucken auf Standardausgabe.
user59178

Speichern Sie ein Byte mitstrpos(_.$i,'3')
Alex Howansky

Speichern Sie ein Byte mit %3<1, eines mit 51anstelle von '3', zwei weitere mit strstr($i)anstelle von strpos(_.$i)und zwei weitere durch Vertauschen der |Operanden in der zweiten Version: <?for(;strstr($i=++$argv[1],51)|$i%3<1;);echo$i;-> 48 Bytes
Titus

2

PHP, 47 41 Bytes

inspiriert von Xanderhall , aber die neueste Idee rechtfertigt endlich eine eigene Antwort.

while(strstr($n+=$n=&$argn%3,51));echo$n;

oder

while(strpbrk($n+=$n=&$argn%3,3));echo$n;

Dies macht sich die Tatsache zunutze, dass die Eingabe auch aus der Sequenz stammt: Denn $n%3==1das neue Modulo ist 2. Denn $n%3==2das neue Modulo ist 4-3=1. $n%3==0passiert nie.

Laufen Sie als Pipe mit -Roder probieren Sie sie online aus .


2

APL (Dyalog Unicode) , 33 28 27 19 Byte SBCS

1∘+⍣{('3'∊⍕⍺)<×3|⍺}

Probieren Sie es online!

-6 danke an Adám. -8 danke an ngn.

Alte Erklärung:

1-⍨g⍣((×3|⊢)>'3'∊⍕)∘(g←+∘1)
                       +∘1   curry + with 1, gives the increment function
                             increments the left argument so we do not return the number itself
                    (g   )  assign to "g"
                            compose g with the repeat
                            does parsing the argument to a string...
             '3'            ...contain '3'?
        3|⊢                  residue of a division by 3
         )                 direction (0 if 0, 1 if greater, ¯1 is lower)
     (      >     )          and not (we want the left side to be 1, the right side 0)
   g                        repeat "g" (increment) until this function is true ^
1-⍨                          afterwards, decrement: inversed -

APL (Dyalog Extended) , 23 SBCS mit 17 Bytes

1∘+⍣(3(×⍤|>∊⍥⍕)⊣)

Probieren Sie es online!

Vielen Dank an Adám. -6 danke an ngn.

Alte Erklärung:

0+⍣(3(×⍤|>∊⍥⍕)⊢)⍢(1+⊢)⊢
0                        the left argument (⍺)
 +⍣(3(×⍤|>∊⍥⍕)⊢)         the left function (⍺⍺)
                 (1+⊢)   the right function (⍵⍵)
                             (increments its argument)
                        the right argument (⍵)
                             (just returns the input)
                        under:
                             calls (⍵⍵ ⍵) first, which increments the input
                             also (⍵⍵ ⍺) which gives 1
                             then calls (⍺incremented ⍺⍺ incremented)
                             afterwards, does the opposite of ⍵⍵, and decrements the result
                         fixpoint: repeats the left operation until the right side is truthy
 +                       calls + with incremented and the input (so, 1+input)
   (3(×⍤|>∊⍥⍕)⊢)         right operation
    3                    on its left, "3"
                        on its right, the current iteration
      ×⍤|                divisibility check: × atop |
        |                    starts with 3|⊢ (residue of ⊢/3)
      ×                      then returns the direction (0 if 0, 1 if greater, ¯1 is lower)
          ∊⍥⍕            contains 3:
                           stringifies both its arguments (3 and ⊢)
          ∊⍥                checks for membership
         >               divisibility "and not" contains 3

2

Perl 6 , 27 25 24 Bytes

{max $_+1...{!/3/&$_%3}}

Probieren 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/&*%3aber es funktioniert nicht mit dem !.:(

Erläuterung:

{                      }   # Anonymous code block
     $_+1                  # From the input+1
         ...               # Get the series
            {         }    # That ends when
             !/3/            # The number does not contain a 3
                 &           # and
                  $_%3       # The number is not divisible by 3
 max                       # And get the last element of the series

1

C 81 Bytes

f(int n){int m;l:if(++n%3){for(m=n;m>0;m/=10)if(m%10==3)goto l;return n;}goto l;}

1

Netz, 30 Bytes

in v
?v$>1+d3,qds:3@cQm*
;\$o

Probieren Sie es online!

Erläuterung

1: Initialisierung

in v

Dies wandelt den input in eine number um und geht dann down ( v)

2: Schleife

?v$>1+d3,qds:3@cQm*
   >                 go right!              [n]
    1+               add 1                  [n+1]
      d3,            duplicate and mod 3    [n+1, (n+1)%3]
         qd          reverse and duplicate  [(n+1)%3, n+1, n+1]
           s         cast to string         [(n+1)%3, n+1, `n+1`]
            :3@c     count numbers of "3"   [(n+1)%3, n+1, `n+1`.count(3)]
                Qm*  negate and rotate      [n+1, continue?]
?v                   terminate if continue
  $                  drop continue

3: endgültig

;\$o
 \$o  drop and output
;     terminate

1

Batch, 93 Bytes

@set/pn=
:l
@set/an+=1,r=n%%3
@if %r%==0 goto l
@if not "%n:3=%"=="%n%" goto l
@echo %n%

Übernimmt die Eingabe für STDIN.


1

CJam, 19 Bytes

ri{)__3%!\`'3e=e|}g

ONLINE

Erläuterung:

ri{)__3%!\`'3e=e|}g
r                   Get token
 i                  Convert to integer
  {              }  Block
   )                 Increment
    _                Duplicate
     _               Duplicate
      3              Push 3
       %             Modulo
        !            NOT gate
         \           Swap
          `          String representation
           '3        Push '3'
             e=      Count occurrences
               e|    OR gate
                  g While popped ToS is true

Wenn eine weniger ausführliche Erklärung gefragt worden wäre, hätte ich das getan:

ri{)__3%!\`'3e=e|}g
ri                  Get integer
  {              }  Block
   )                 Increment
    __               Triplicate
      3%!            Test non-divisibility with 3
         \           Swap
          `'3e=      Count occurrences of '3' in string repr
               e|    OR gate
                  g While popped ToS is true

1

Pyth, 19 Bytes

JhQW|!%J3/`J\3=hJ;J

Testsuite

Ich bin sicher, dass ich das Golf spielen kann ... es ist das gleiche wie meine CJam-Antwort.

Erläuterung:

JhQW|!%J3/`J\3=hJ;J
  Q                 Evaluated input
 h                  Increment
J                   Assign J to value
       J            Variable J
        3           Value 3
      %             Modulo
     !              Logical NOT
           J        Variable J
          `         String representation
            \3      Value "3"
         /          Count occurrences
    |               Logical OR
               h    Increment
                J   Variable J
              =     Apply function then assign
                 ;  End statement block
                  J Variable J

Ich habe eine viel kürzere Lösung gepostet. Dennoch ist hier ein Tipp für Ihren Ansatz: Verwenden Sie die Variable nicht J. Sie können inkrementieren Q. Und wenn Sie es clever machen, können Sie die Operation in die while-Bedingung W|!%=hQ3/einbinden : Q \ 3; Q`.
Jakube

Entschuldigung:W|!%=hQ3/`Q\3;Q
Jakube

@Jakube Die Variable erhöht sich nicht nur, sondern bedankt sich.
Erik der Outgolfer

1

Clojure, 73 Bytes

(fn c[n](let[m(inc n)](if(or(=(rem m 3)0)(some #(=\3 %)(str m)))(c m)m)))

Durchläuft rekursiv eine Schleife, während ndurch 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

(defn count-without-3 [n]
  (let [m (inc n)]
    (if (or (= (rem m 3) 0)
            (some #(= \3 %) (str m)))
      (count-without-3 m)
      m)))
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.