Contare senza 3


45

sfondo

Quando ero alle elementari, giocavamo in una lezione di matematica che procede come segue.

Tutti i bambini siedono in un grande cerchio e, a turno, contano, a partire da 1 .

Tuttavia, i seguenti numeri devono essere saltati durante il conteggio:

  • Numeri multipli di 3 .
  • Numeri che hanno un 3 nella sua rappresentazione decimale.

I primi 15 numeri che i bambini dovrebbero dire sono

1 2 4 5 7 8 10 11 14 16 17 19 20 22 25

Ogni volta che qualcuno sbaglia un numero - dice un numero che non è nella sequenza o salta un numero che lo è - viene rimosso dal cerchio. Questo continua fino a quando rimane solo un bambino.

Compito

Sei cattivo in questo gioco, quindi decidi di imbrogliare. Scrivi un programma o una funzione che, dato un numero della sequenza, calcola il numero successivo della sequenza.

Non è necessario gestire numeri che non possono essere rappresentati utilizzando il tipo numerico nativo della lingua, a condizione che il programma funzioni correttamente fino all'input 251 e che l'algoritmo funzioni per input arbitrariamente grandi.

Input e output possono utilizzare qualsiasi base conveniente.

Dal momento che devi nascondere il tuo codice, deve essere il più breve possibile. In realtà, questo è , quindi vince il codice più breve in byte.

Casi test

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

5
Sento che abbiamo avuto una sfida come questa ...
Conor O'Brien,

5
È sempre 7stato saltato quando l'ho giocato, ma invece avresti detto qualcos'altro, invece di passare al numero successivo in linea.
mbomb007,

12
@ mbomb007: quando l'ho giocato, non saresti stato rimosso dal cerchio. Invece, bevi. Ma quello non era nella scuola elementare. Ad ogni modo, superare gli 80 era quasi impossibile, soprattutto dopo la prima ora.
Tomasz,


4
@ mbomb007: dipende dalla prova di ciò che stai bevendo.
Tomasz,

Risposte:


21

Brachylog , 10 byte

<.='e3:I'*

Provalo online!

Spiegazione

(?)<.                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
Le risposte come questa sono così belle in Brachylog :)
Emigna,

3
@Emigna A volte non sembra abbastanza golfy perché in sostanza descrive direttamente la sfida. È il caso di molte risposte in quella lingua :)
Fatalizza il

14

JavaScript (ES6), 30 byte

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

Sia l'indice 2 che l'indice 3 restituiscono il numero 4 con questa funzione
nl-x

1
@ nl-x Sì, perché 4 è il numero successivo nella sequenza dopo 2 e 3. Non è indicizzato; è semplicemente il numero successivo nella sequenza.
ETHproductions

Penso che sto iniziando a capirlo ... Mio male
nl-x

8

J, 24 byte

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

Approccio diretto che scorre semplicemente dall'input n fino a quando non trova il numero successivo valido dalle regole.

Forme cinque smileys, $:, :), 0=, =|, e >:.

uso

   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

Spiegazione

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

Bene, J è probabilmente il linguaggio di programmazione più incline alle emoticon.
Adám,

8

Python 2, 73 66 43 byte

Grazie a xnor per avermi detto che ero sciocco usando 2 variabili e grazie anche a Mitch Schwartz.

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

1
L'aggiornamento a due variabili sembra troppo complicato. Penso che tu abbia solo bisogno x=input()+1 while'3'[:x%3]in`x`:x+=1 print x.
xnor

@xnor, oh sì, sciocco, non so perché l'ho fatto
Daniel,

Miglioramento di un byte iniziando con x=~input(), sottraendo invece di aggiungere e stampare -x.
Mitch Schwartz,

1
@Artyer Questo è solo uno dei 3 errori introdotti in quella modifica.
Mitch Schwartz,

1
@Dopapp La revisione corrente (senza spazio) è di 43 byte? mothereff.in/…
Artyer,

7

05AB1E , 11 byte

[>Ð3ås3Ö~_#

Provalo online!

Spiegazione

               # 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 byte

18 byte codice + 1 per -p.

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

uso

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

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

1
@ dan1111 È Perl, cosa ti aspettavi? Chiarezza?
Erik the Outgolfer,

1
@EriktheGolfer cosa? Questa è la definizione stessa di "codice auto-documentante".

@ dan1111 Sembra che tu conosca Perl. Non ho idea di come funzioni Perl, a causa della sua stranezza famosa.
Erik the Outgolfer,

@ dan1111 Grazie! Abbastanza contento di quanto è risultato breve!
Dom Hastings,

1
@DomHastings Bene, in PPCG, prendiamo Perl come il massimo livello di stranezza, e Jelly / Actually / O5AB1E come il massimo livello di confusione. Sembra che non hai mai visto questa sfida allora :)
Erik the Outgolfer

6

Java 8, 57 56 55 50 byte

Grazie a @Numberknot per 1 byte Grazie a @Kevin Cruijssen per 5 byte

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

Questo è un Function<Integer, Integer>

Spiegazione

Implementazione ingenua che aumenta semplicemente fino a raggiungere un numero accettabile.

Classe di prova

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

}

Uscita della classe di prova:

1 2 4 5 7 8 10 11 14 16

2
È possibile utilizzare |invece di||
Numberknot

1
@Numberknot Non avevo idea che gli operatori bit per bit funzionassero come logici in alcuni contesti! Grazie!
Socratic Phoenix,

1
Perché il do-while? Solo un for-loop regolare è più corto: i->{for(;++i%3<1|(i+"").contains("3"););return i;}( 50 byte )
Kevin Cruijssen,

@KevinCruijssen Beh ... ho pensato di confrontare whilee do-while, ed entrambi mi hanno dato lo stesso punteggio, ma mi è piaciuto il modo in cui do-whilesembrava ... Non pensavo di usare un forloop ... Grazie!
Socratic Phoenix,

5

Japt, 18 byte

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

Provalo online

Finalmente ho la possibilità di usare ß:-)

Come funziona

                    // 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

Accetta input $args[0], aggiunge 1, salva in $a, avvia un forloop. Il condizionale mantiene il ciclo attivo mentre uno dei due $a-match3(corrispondenza regex) -or $a%3è zero (il !cui è 1). Il ciclo semplicemente aumenta $a++. Alla fine del loop, ci limitiamo a posizionarci $asulla pipeline e l'output tramite implicito Write-Outputavviene al completamento del programma.

Esempi

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 byte

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

Penso che sia permesso restituire un valore (piuttosto che stampare su stdout), quindi puoi salvare 5 byte avendo semplicemente ninvece di cat(n).
rturnbull,

4

Pitone 2, 49 44 42 byte

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

L'altra voce di Python batte questo (modifica: non più MrGreen), ma l'ho postata perché preferisco il suo approccio ricorsivo. Grazie a Mitch Schwarz ed Erik il golfista per avermi aiutato a renderlo più breve.


1
È possibile farlo in Python 2: f=lambda x:f(x+1)if x%3>1or'3'in`x+1`else-~x. Se vuoi mantenere Python 3, puoi giocare a golf x+1per ultimo -~xe rimuovere lo spazio.
Erik the Outgolfer,

@EriktheGolfer Grazie! Lo cambierò in Python 2, poiché è molto più breve.
0WJYxL9FMN

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

3

Lua, 58 byte

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

3

Pyke, 13 byte

Whii3%!3`i`{|

Provalo qui!

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

1
All'inizio ho pensato che questo whileall'inizio.
Conor O'Brien,

Se lo guardi, posso vederlo
Blue,

3

C #, 56 , 51 byte.

Questo è sorprendentemente breve per una risposta in C #!

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

Puoi ridurlo a 43 se lo rendi ricorsivo t=x=>(++x)%3<1|(x+"").Contains("3")?t(x):x; In Visual Studio, devi solo definire la variabile e impostarla su null, Func<int, int> t = null;quindi definire la funzione ricorsiva sulla riga seguente.
Grax32,

Il problema è che se lo rendo ricorsivo, devo quindi contare la funzione e digitare le definizioni.
Morgan Thrapp,

C'è un posto dove posso andare a vedere queste linee guida? Trovo confuso il golf C # qui.
Grax32,

@Grax Fondamentalmente, è necessario includere qualsiasi codice necessario per l'esecuzione del codice, tranne l'assegnazione a un nome nel caso di una funzione non ricorsiva. Sfortunatamente, non so dove troverai una serie di linee guida concrete.
Morgan Thrapp,

@MorganThrapp, controlla la mia risposta c # con ricorsione a 49 byte :)
lee

3

Haskell, 50 48 byte

f n=[x|x<-[n..],mod x 3>0,notElem '3'$show x]!!1

Provalo su Ideone. Salvato 2 byte grazie a @Charlie Harding .

Alternativa: (50 byte)

g=f.(+1)
f n|mod n 3<1||(elem '3'.show)n=g n|1<3=n

1
Anche 50 byte: until(\x->mod x 3>0&&notElem '3'(show x))succ.succ.
nimi,

3

Pyth, 11 byte

f&-I`T3%T3h

Provalo online: Dimostrazione o Test Suite

Spiegazione:

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

Rubino, 47 byte

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

Sento davvero che questo può essere ulteriormente giocato a golf.


puoi usare iinvece di"#{i}"
Mhmd

2

MATL , 14 byte

`Qtt3\wV51-hA~

Provalo online!

Spiegazione

`       % 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 byte

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

Provalo online!

Labyrinth è un linguaggio di programmazione bidimensionale basato su stack e alle giunzioni, la direzione è determinata dalla parte superiore dello stack (positivo va a destra, negativo va a sinistra, zero va dritto). Ci sono due loop principali in questo programma. Il primo modifica l'input intero di 3 e incrementa se 0. Il secondo controlla ripetutamente se l'ultima cifra è 3 (sottraendo 3 e modificando per 10) e quindi dividendo per 10 per ottenere una nuova ultima cifra.


2

PHP, 60 55 54 46 byte

Grazie a @ user59178 per la rasatura di pochi byte, @AlexHowansky per un byte, @Titus per altri pochi byte

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

Chiamato dalla riga di comando con -r. Metodo ingenuo che esegue il ciclo mentre il numero è un multiplo di 3 o ha 3 nelle sue cifre.


1
Puoi salvare 7 byte semplicemente usando un programma che prende input dalla riga di comando piuttosto che una funzione: for($i=$argv[1];!(++$i%3)|strpos(" $i",'3'););echo$i;potrebbe essere possibile fare meglio assegnando $imentre lo usi anche.
user59178

@ user59178 Supponevo che la funzione dovesse restituire $ i
Xanderhall il

il più delle volte le domande sono piuttosto flessibili su come vengono fatti input e output, purché venga data e ricevuta la cosa giusta. Inoltre, guardando le risposte in altre lingue, la maggior parte sceglie di stampare su stdout.
user59178

Salva un byte constrpos(_.$i,'3')
Alex Howansky il

Salva un byte con %3<1, uno con 51anziché '3'due, altri con strstr($i)invece di strpos(_.$i)e altri due scambiando gli |operandi nella seconda versione: <?for(;strstr($i=++$argv[1],51)|$i%3<1;);echo$i;-> 48 byte
Titus

2

PHP, 47 41 byte

ispirato da Xanderhall , ma l'ultima idea giustifica finalmente una propria risposta.

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

o

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

Questo si avvale del fatto che anche l'input proviene dalla sequenza: Per $n%3==1, il nuovo modulo è 2. Per $n%3==2, il nuovo modulo è 4-3=1. $n%3==0non succede mai.

Esegui come pipe -Ro provali online .


2

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

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

Provalo online!

-6 grazie ad Adám. -8 grazie a ngn.

Vecchia spiegazione:

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 17 byte SBCS

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

Provalo online!

Grazie ad Adám. -6 grazie a ngn.

Vecchia spiegazione:

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 byte

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

Provalo online!

Trova il primo numero più grande dell'input che non ha un tre e ha un resto quando è modulo di 3. Speravo di fare qualcosa di stravagante con la condizione, come !/3/&*%3ma non funziona con il !.:(

Spiegazione:

{                      }   # 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 byte

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

reticolare, 30 byte

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

Provalo online!

Spiegazione

1: inizializzazione

in v

Questo converte input in number, quindi scende ( v)

2: loop

?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: finale

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

1

Lotto, 93 byte

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

Accetta input su STDIN.


1

CJam, 19 byte

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

IN LINEA

Spiegazione:

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

Se fosse stata chiesta una spiegazione meno dettagliata, avrei fatto questo:

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 byte

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

Suite di test

Sono sicuro di poter giocare a golf ... è uguale alla mia risposta CJam.

Spiegazione:

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

Ho pubblicato una soluzione molto più breve. Tuttavia, ecco un suggerimento per il tuo approccio: non usare la variabile J. Puoi incrementare Q. E se lo stai facendo in modo intelligente, puoi incorporare l'operazione nella condizione while: W|!%=hQ3/Q \ 3; Q`.
Jakube

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

@Jakube La variabile non sta solo incrementando, ma grazie.
Erik the Outgolfer,

1

Clojure, 73 byte

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

Cicli ricorsivamente mentre n è divisibile per 3 o contiene un 3 nella sua rappresentazione di stringa. Anche se sto usando la ricorsione non ottimizzata, è stato in grado di gestire 2999999 come input, quindi dovrebbe essere ok.

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)))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.