Sì Ma No Ma Sì


46

Il mio collega recentemente mi ha inviato il seguente pezzo di JavaScript come uno scherzo:

let butScript = (nrOfButs) => {
    for(var i = 0; i < nrOfButs; i++){
        if(i % 3 == 0){
            console.log("Yeah")
        }
        if(i % 2 == 0){
            console.log("But")
        }
        if(i % 3 == 1){
            console.log("No")
        }
    }
}

Poiché il codice è stato scritto durante l'orario di lavoro, è stato ovviamente un enorme spreco di risorse aziendali. Per evitare simili eventi in futuro, dobbiamo ridurre al minimo lo spreco di ore lavorate. E poiché è risaputo che un programma più breve è più veloce da scrivere, dobbiamo golfizzare questo codice per essere il più breve possibile!

Ingresso

Un singolo numero intero non negativo. Non è necessario gestire input errati.

Produzione

Il tuo programma deve produrre un output identico a quello dello script sopra. Dovresti generare una parola per riga e il numero di parole dovrebbe essere coerente con lo script originale.

È consentito includere caratteri di spazi bianchi non newline alla fine di ogni riga (ma non all'inizio) poiché sono invisibili. È consentito un carattere di nuova riga aggiuntivo alla fine dell'output.

Esempi

Input: 0
Output:


Input: 1
Output:
Yeah
But

Input: 2
Output:
Yeah
But
No

Input: 10
Output:
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah

3
Possiamo restituire un elenco di righe?
Jo King,

10
Deve essere divertente lavorare con un ragazzo così divertente! : s Una nota leggermente più seria: la nrOfButsvariabile ha un nome piuttosto mediocre e fuorviante. Bella semplice sfida comunque.
Arnauld,

10
Riceviamo un bonus se l'ultima riga è "Dio non può credere che tu l'abbia appena detto!"
Ciaran_McCarthy,

3
@EriktheOutgolfer passa ifattraverso la s e continua nel ciclo corrente se le loro condizioni erano soddisfatte.
dzaima,

4
Il codegolf più australiano di sempre? Tranne che dovrebbe essere "nah"
Nacht - Reinstate Monica il

Risposte:


48

Excel, 78 byte

Presuppone l'input nella cella A1 e che la formattazione di Wordwrap è attivata per la cella. Utilizzare Alt + Invio per aggiungere avanzamenti di riga all'interno della stringa e annotare lo spazio bianco. Gestisce solo input fino a 3570 a causa del limite della funzione REPT (buona fortuna, però, ottenere una cella così alta).

=LEFT(REPT("Yeah
But
No      
But     
Yeah    
But
No           
",595),A1*9)

Ristampa, con punti per spazi bianchi

=LEFT(REPT("Yeah
But
No......
But.....
Yeah....
But
No...........
",595),A1*9)

Come funziona: il modello si ripete ogni 6 numeri:

0 = Yeah and But      Yeah + linefeed + But + linefeed
1 = No                No + 6 whitespace + line feed
2 = But               But + 5 whitespace + linefeed
3 = Yeah              Yeah + 4 whitespace + linefeed
4 = But and No        But + linefeed + No + 3 whitespace
5 = Blank             8 whitespace + linefeed

Ognuno di questi può essere espresso con 9 caratteri, quindi una stringa è composta da 54 caratteri (9 * 6), quindi ripetuta grande quanto Excel consentirà. Quindi prende i caratteri a sinistra 9 * (numero di input) come output.

Linefeed per il "ma e nessuno" viene inserito dopo lo spazio vuoto in modo che Yeah per # 6, # 12, (ecc.) Sia formattato a sinistra anziché a destra e in modo che non vi sia alcun avanzamento riga vuoto aggiunto ogni 6a riga per quell'articolo.

Produzione


1
Non ho modo di verificarlo, ma la tua descrizione lo fa sembrare corretto. Puoi aggiungere alcune coppie di input / output di esempio? Una delle lingue più ridicole, ma comunque un'ottima risposta.
max

16
@maxb Non può essere così ridicolo quando batte altre lingue.
Keeta,

1
Grande spiegazione e tecnica molto interessante. Funziona anche con LibreOffice Calc ma potrebbe essere necessario giocare con la formattazione. +1
ElPedro,

20

JavaScript (ES6), 59 57 byte

f=n=>n?f(n-1)+[s=n&1?`But
`:'',`Yeah
`+s,s+`No
`][n%3]:''

Provalo online!

Come?

Usiamo una funzione ricorsiva che va da a anziché da a .1 0 n - 1n10n1

Di conseguenza, i test sono disattivati ​​di rispetto al codice di riferimento:1

  • se , visualizza "Sì"n1(mod3)
  • se , visualizza "Ma"n1(mod2)
  • se , visualizza "No"n2(mod3)

Questo ci consente di memorizzare il caso più semplice come prima voce del nostro array di ricerca, in cui possiamo definire : una variabile che contiene una o una stringa vuota.sn0(mod3)s"But\n"

Le altre due voci sono definite come "Yeah\n" + se s + "No\n"rispettivamente.

Nota: iterando da a , potremmo anche definire nella prima voce, ma costerebbe due parentesi extra .0 sn10s

Commentate

f = n =>            // n = input
  n ?               // if n is not equal to 0:
    f(n - 1) +      //   prepend the result of a recursive call with n - 1
    [               //   define our lookup array:
      s = n & 1 ?   //     1st entry: if n is odd:
        `But\n`     //       set s to "But"
      :             //     else:
        '',         //       set s to an empty string
      `Yeah\n` + s, //     2nd entry: "Yeah" followed by s
      s + `No\n`    //     3rd entry: s followed by "No"
    ][n % 3]        //   append the correct entry for this iteration
  :                 // else:
    ''              //   return an empty string and stop recursion

16

LOLCODE , 257 byte

HAI 1.2
I HAS A B
GIMMEH B
B IS NOW A NUMBR
I HAS A C ITZ 0
IM IN YR L UPPIN YR C TIL BOTH SAEM B AN C
I HAS A D ITZ MOD OF C AN 3
D
WTF?
OMG 0
VISIBLE "Yeah"
OIC
MOD OF C AN 2
WTF?
OMG 0
VISIBLE "But"
OIC
D
WTF?
OMG 1
VISIBLE "No"
OIC
IM OUTTA YR L
KTHXBYE

Provalo online!


2
Sembra fantastico (odio codificarlo!), Ma nel caso di test 10 il 2 ° "No" e il 3 ° "Ma" vengono capovolti ... Quindi sì, ma no: D
seadoggie01

2
Spiacenti, ho pensato di poter ottimizzare lì. Questo è un modello complicato. L'ho risolto ora.
JosiahRyanW,

1
Adoro il modo in cui legge
LocustHorde,

4
Si VISIBLE "But"riferisce alla mancanza di pantaloni del programma?
JDL,

12

Spazio bianco , 315 304 300 277 276 byte

Grazie a @JoKing per -11 byte (riducendo la quantità di etichette utilizzate da 8 a 7) e -24 più byte (modificando il flusso generale del programma e riducendo la quantità di etichette utilizzate da 7 a 5 nel processo).

[S S S N
_Push_0][T  N
T   T   _Read_STDIN_as_integer][N
S S N
_Create_Label_LOOP][S S S N
_Push_0][T  T   T   _Retrieve][N
T   S S N
_If_negative_jump_to_Label_PRINT][S S S N
_Push_0][T  T   T   _Retrieve][S S S T  T   N
_Push_3][T  S T T   _Modulo][S S S T    S N
_Push_2][T  S S T   _Subtract][N
T   T   T   N
_If_negative_jump_to_Label_SKIP_NO][S S T   T   S T T   T   T   S N
_Push_-94_\n][S S S T   T   T   N
_Push_7_o][S S T    T   T   S T S N
_Push_-26_N][N
S S T   N
_Create_Label_SKIP_NO][S S S N
_Push_0][T  T   T   _Retrieve][S S S T  S N
_Push_2][T  S T T   _Modulo][N
T   S S S N
_If_0_jump_to_Label_SKIP_BUT][S S T T   S T T   T   T   S N
_Push_-94_\n][S S S T   T   S S N
_Push_12_t][S S S T T   S T N
_Push_13_u][S S T   T   S S T   T   S N
_Push_-38_B][N
S S S S N
_Create_Label_RETURN_FROM_BUT][S S S N
_Push_0][S N
S _Duplicate_0][S N
S _Duplicate_0][T   T   T   _Retrieve][S S S T  N
_Push_1][T  S S T   _Subtract][T    T   S _Store][T T   T   _Retrieve][S S S T  T   N
_Push_3][T  S T T   _Modulo][N
T   S S T   N
_If_0_jump_to_Label_YEAH][N
S N
N
_Jump_to_Label_LOOP][N
S S S T N
_Create_Label_YEAH][S S T   T   S T T   T   T   S N
_Push_-94_\n][S S S N
_Push_0_h][S S T    T   T   T   N
_Push_-7_a][S S T   T   T   N
_Push_-3_e][S S T   T   T   T   T   N
_Push_-15_Y][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_PRINT][S S S T    T   S T S S S N
_Push_104][T    S S S _Add][T   N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

Lettere S(spazio), T(scheda) e N(nuova riga) aggiunti solo come evidenziazione.
[..._some_action]aggiunto solo come spiegazione.

Provalo online (solo con spazi non elaborati, schede e nuove righe).

Whitespace non è sicuramente la lingua giusta per questa sfida. In Whitespace sia i loop che le istruzioni if ​​sono fatti con etichette e salti alle etichette, e poiché non sono casi if-elseif-else ma più if-case, significa che io dovrò tornare indietro dopo ogni se, rendendolo abbastanza lungo significa che dovrò modificare leggermente i controlli per saltare alcune stampe (grazie @JoKing ).

Spiegazione in pseudo-codice:

Read STDIN as integer, and store it in the heap
Start LOOP:
  Integer i = retrieve integer from heap
  If(i is negative):
    Call function PRINT
  If(i modulo-3 is NOT 2):
    Jump to Label SKIP_NO
  Push "\noN" to the stack
  Label: SKIP_NO
  If(i modulo-2 is 0):
    Jump to Label SKIP_BUT
  Push "\ntuB" to the stack
  Label: SKIP_BUT
  i = i - 1
  Replace i in the heap with this updated value
  If(i modulo-3 is 0):
    Call function YEAH
  Go to next iteration of LOOP

function YEAH:
  Push "\nhaeY" to the stack
  Go to next iteration of LOOP

function PRINT:
  Print top of the stack as character to STDOUT
  Go to next iteration of LOOP (which will enter the if and then
                                comes back to this PRINT again)

Spiegazione aggiuntiva:

In generale, scorre dall'input fino a 0, spingendo una nuova riga e la parola invertita (quindi nell'ordine "\ noN", "\ ntuB", "\ nhaeY" invece di "Yeah \ n", "Ma \ n "," No \ n "). E dopo che l'input si è ridotto a 0 e tutti i caratteri sono in pila, li stampa in ordine inverso (quindi l'ordine di output corretto).

Più in profondità, tuttavia: sebbene sia necessario stampare parole nell'intervallo (input, 0], verrà invece inserito nell'intervallo [input, 0). Per questo if(i%3 == 2)motivo , possiamo usare il controllo per "\ noN" (o effettivamente, if(i%3 != 2)saltare il push di "\ noN"), e possiamo usare il controllo if(i%2 != 1)per "\ ntuB" (o in realtà, if(i%2 == 0)saltare il push di "\ ntuB" ). Solo dopo questi due controlli diminuiamo l'iterazione idi 1. E quindi if(i%3 == 0)eseguiamo il controllo per inviare "\ nhaeY", simile al codice di esempio JS nella descrizione della sfida. Saltare con i controlli if-not invece di andare su un'etichetta e tornare dall'etichetta con if-checks salvati 23 byte.

Inoltre, in Whitespace i valori dei caratteri sono memorizzati nello stack come valori unicode (ad es. 10Per new-line, 65per 'A', 97per 'a', ecc.). Dato che ho già bisogno di passare in rassegna lo stack per stampare i caratteri, sono anche in grado di utilizzare il mio suggerimento per gli spazi bianchi per ridurre il conteggio dei byte aggiungendo una costante ai valori numerici, prima di stamparli come caratteri.
Questa costante è 104in questo caso, che viene generata con questo programma Java che ho anche usato per golf un'altra mia risposta agli spazi bianchi prima . Questo è anche il motivo per cui questa parte del codice:

[S S T  T   S T T   T   T   S N
_Push_-94_\n][S S S T   T   T   N
_Push_7_o][S S T    T   T   S T S N
_Push_-26_N]

ha i valori -94per la newline, 7per la 'o' e -26per la 'N'. Perché l'aggiunta della costante di 104darà correttamente i nostri valori unicode e 10, rispettivamente 111, 78per questi caratteri.


1
Sicuramente non mi aspettavo una risposta da Whitespace. Buon lavoro!
max

@maxb Grazie! Sfortunatamente è un po 'più lungo del previsto a causa delle 8 etichette che richiede .. Ma sono già felice che funzioni. :)
Kevin Cruijssen,

Non potresti dimezzare le etichette saltando all'istruzione if successiva se la condizione è falsa? ad es.if i modulo-3 != 1 jump to next if else push NO
Jo King,

1
@JoKing Ah aspetta, ho frainteso una parte del tuo pseudo-codice. Il mio primo problema di non recuperare iprima che if(i is 0) call PRINTsia vero, ma l'altro sta controllando iprima di sottrarlo e saltare le stampe. Abbastanza intelligente in realtà. Continuerà ad implementarlo.
Kevin Cruijssen,

1
Bene, se salti all'inizio del ciclo, eseguirà di nuovo l'istruzione if e tornerà direttamente alla funzione di stampa. Forse questo fa risparmiare un byte se cambi l'etichetta del ciclo in un'etichetta vuota
Jo King,


11

Perl 6 , 63 50 byte

{<<"Yeah But"No But Yeah"But No">>[^$_ X%6].words}

Provalo online!

Blocco di codice anonimo che accetta un numero e restituisce un elenco di righe

Spiegazione:

{                                                }   # Anonymous code block
 <<"Yeah But"No But Yeah"But No">>  # Create the list of strings:
                                     # Yeah But
                                     # No
                                     # But
                                     # Yeah
                                     # But No
                                  [       ]  # Index into this list
                                   ^$_  # The range from 0 to n-1
                                       X%6  # All modulo 6
                                           .words  # Convert the list to a string 
                                                   # Which joins by spaces
                                                   # And split by whitespace


8

05AB1E (legacy) , 27 25 24 byte

Salvato 1 byte grazie a Kevin Cruijssen .

F”¥æ€³€¸”#N3ÖNÈN3%‚‚˜Ï`»

Provalo online!

Spiegazione

F                          # for N in [0 ... input] do:
 ”¥æ€³€¸”#                 # push ['Yeah', 'But', 'No']
          N3Ö              # push N % 3 == 0
             NÈ            # push N % 2 == 0
               N3%         # push N % 3
                  ‚‚˜      # add the 3 numbers to a list
                     Ï     # keep only the strings whose corresponding value  
                           # in the int list is true (1)
                      `»   # push strings separately to stack and join stack on newlines

Dang, mi hai battuto ... Stava per pubblicare una risposta. Il tuo è comunque più corto, quindi +1 da parte mia .. Buon uso di ×, non ci avevo pensato!
Kevin Cruijssen,

Wow, mi piacerebbe una spiegazione su questo. Il mio record personale era di 44 byte in CJam.
max

@maxb: ovviamente aggiungerò una spiegazione. Sto solo controllando per vedere se riesco a
giocarci

Puoi rimuovere Θora che non stai più usando ×, dato Ïche guarderà solo a 1s, quindi ignora il 2(e 0ovviamente).
Kevin Cruijssen,

@KevinCruijssen: grazie! Non sono sicuro di come mi sia perso: P
Emigna,


6

Python 2 , 97 95 92 90 83 81 byte

lambda n:[w for i in range(n)for w in'Yeah','But','No'if('N'in w)==i%(3-(w<'N'))]

Provalo online!

-2 byte, grazie agli ovs


Python 3 , 92 90 85 83 byte

lambda n:[w for i in range(n)for w in['Yeah','But','No']if('N'in w)==i%(3-(w<'N'))]

Provalo online!

-4 byte, grazie agli ovs

-4 byte, grazie a Jo King


86 byte combinando i due e ritornando come un elenco di righe
Jo King,

@JoKing Grazie, non sapevo che potevo tornare invece di stampare quando l'ho scritto.
TFeld,

82 byte : len(w)<3-> 'N'in w, 81 byte : len(w)%2->(w<'N')
ovs


6

Groovy (funzione), 79 byte

Da quando ho inviato inizialmente la mia risposta, ho esaminato alcune discussioni storiche qui su ciò che costituisce una risposta adeguata. Dal momento che sembra comunemente accettato di fornire solo un metodo in Java (incluso il tipo restituito e le dichiarazioni dei parametri), ecco un metodo più breve, Groovy, che ha il valore restituito dal metodo come risposta. L'uso di defsignifica che il tipo restituito viene dedotto.

def a(int n){n?a(--n)+(n%3?'':'Yeah\n')+(n%2?'':'But\n')+(n%3==1?'No\n':''):''}

A differenza della risposta originale di seguito, che passa da 0 a n-1, questa si chiama da n in giù a 1, ma diminuisce l'input per il resto della linea nella chiamata ricorsiva.

Provalo online!

Groovy (programma), 87 byte

Gli script Groovy non richiedono alcune importazioni comuni, quindi questo può essere un programma che stampa la risposta allo STDOUT di Java senza doverlo dichiarare System.out.prima print. Fornisce inoltre alcuni metodi di utilità comuni, come questo toLong()che ci consente di analizzare l'argomento di input ragionevolmente in modo consecutivo.

Essenzialmente la risposta di Java 10, ma sfruttando la sintassi del ciclo più breve di Groovy e la capacità di valutare le affermazioni di verità.

args[0].toLong().times{print((it%3?'':'Yeah\n')+(it%2?'':'But\n')+(it%3==1?'No\n':''))}

Provalo online!


Benvenuti in PPCG! Ottima prima risposta! Non ho codificato alcun Groovy, ma potrei suggerire di eseguire il tuo codice su TIO ? In questo modo, può essere validato da altri e apprezzato da tutti.
max

1
@maxb Grazie! Ne ho aggiunto uno :)
archangel.mjj,

Bella prima risposta e benvenuto anche in PPCG.
ElPedro,

5

Retina 0.8.2 , 45 byte

.+
$*
1
$`Yeah¶$`But¶$`11No¶
+`11B
B
111

A`1

Provalo online! Spiegazione:

.+
$*

Converti l'input in unario.

1
$`Yeah¶$`But¶$`11No¶

Per ogni numero intero 0...n-1, genera tre righe di testo, una per ogni parola, ognuna con i 1s prima di essa, ad eccezione di No, che ha due 1s in più in modo da calcolare (i+2)%3==0quale è equivalente i%3==1.

+`11B
B

Rimuovere le coppie di 1s prima di Bs.

111

Rimuovi 1s in gruppi di tre ovunque.

A`1

Elimina tutte le righe che hanno ancora un 1.


Oh, ora che vedo 11No¶calcolare (i+2)%3==0(quindi tutti e tre sono if-check per ==0) sembra così ovvio, ma non ci avrei pensato da solo, quindi in realtà è abbastanza geniale. +1 da parte mia, bella risposta!
Kevin Cruijssen,

5

Java 10, 100 99 byte

n->{for(int i=0;i<n;)System.out.print((i%3<1?"Yeah\n":"")+(i%2<1?"But\n":"")+(++i%3>1?"No\n":""));}

-1 byte grazie a @ OlivierGrégoire .

Provalo online.

Spiegazione:

n->{                   // Method with integer parameter and no return-type
  for(int i=0;i<n;)    //  Loop `i` in the range [0, `n`)
    System.out.print(  //   Print to STDOUT:
      (i%3<1?          //    If `i` is divisible by 3:
        "Yeah\n"       //     Print "Yeah" with newline
      :"")+(i%2<1?     //    If `i` is even:
        "But\n"        //     Print "But" with newline
      :"")+(++i%3>1?   //    If `i` modulo-3 is 1:
        "No\n"         //     Print "No" with newline
      :                //    If none of the above three if's applied to the current `i`:
       ""));}          //     Print nothing for the current `i`

1
++i%3>1probabilmente ti farà risparmiare un byte
Olivier Grégoire,

@ OlivierGrégoire Ah, certo. Grazie!
Kevin Cruijssen,

5

Powershell, 75 74 72 67 66 byte

-1 byte grazie a TessellatingHeckler

param($n)(" Yeah
But No But Yeah But
No "*$n-split' ')[1..$n]-ne''

Test script e spiegazione:

$f = {

param($n)(" Yeah
But No But Yeah But
No "*$n-split' ')[1..$n]-ne''

# 1. repeat the string $n times
# 2. split by space
# 3. get elements from 1 to $n
# some elements are multiline strings, some elements are $null:
# ($null,"Yeah`nBut","But","No","But","Yeah","But`nNo",$null,...)
# 4. remove $null elements from result array

}

# Output results
@(
    0,1,2,10
) | % {
    &$f $_
    "======"
}

# Advanced test
@(
    ,(0,'')
    ,(1,'Yeah But')
    ,(2,'Yeah But No')
    ,(3,'Yeah But No But')
    ,(4,'Yeah But No But Yeah')
    ,(5,'Yeah But No But Yeah But No')
    ,(6,'Yeah But No But Yeah But No')
    ,(7,'Yeah But No But Yeah But No Yeah But')
    ,(8,'Yeah But No But Yeah But No Yeah But No')
    ,(9,'Yeah But No But Yeah But No Yeah But No But')
    ,(10,'Yeah But No But Yeah But No Yeah But No But Yeah')
    ,(20,'Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No')
) | % {
    $n,$e = $_
    $r = &$f $n
    $r = $r-split"`n"       # simplify test string
    "$($e-eq$r): $n : $r"
}

Produzione:

======
Yeah
But
======
Yeah
But
No
======
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah
======
True: 0 :
True: 1 : Yeah But
True: 2 : Yeah But No
True: 3 : Yeah But No But
True: 4 : Yeah But No But Yeah
True: 5 : Yeah But No But Yeah But No
True: 6 : Yeah But No But Yeah But No
True: 7 : Yeah But No But Yeah But No Yeah But
True: 8 : Yeah But No But Yeah But No Yeah But No
True: 9 : Yeah But No But Yeah But No Yeah But No But
True: 10 : Yeah But No But Yeah But No Yeah But No But Yeah
True: 20 : Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No

Script semplice, 72 byte:

$args|?{$_}|%{0..--$_|%{@('Yeah')[$_%3]
@('But')[$_%2]
@{1='No'}[$_%3]}}

1
Bella risposta! Sarebbe possibile aggiungere un output alla risposta, dal momento che non include un interprete online?
max

La risposta scriptblock non ritorna ======. Genera Yeah,But,Nosolo stringhe. Lo script di test mostra un separatore per una più semplice lettura dei risultati.
mazzy,

Quell'uso hashtable è intelligente. Devo ricordarmelo.
AdmBorkBork,


1
@mazzy Posso riformulare il tuo, ma non riesco ancora a battere 67 (sostituisci i due \ n con vere nuove linee)(" Yeah\nBut No But Yeah But\nNo "*($j="$args")|% s*t 32)[1..$j]-ne''
TessellatingHeckler,

4

Haskell , 71 byte

f n=[1..n]>>=(3?1)"Yeah"<>(2?1)"But"<>(3?2)"No"
(a?b)c n=[c|n`mod`a==b]

Provalo online!

Spiegazione

Abbastanza semplice, salvato due byte usando [1..n]invece di [0..n-1]e adattato i rimanenti: i (?)test dell'operatore accettano quattro argomenti, restituendo un elenco vuoto o la stringa fornita come singleton se il risultato è corretto.

Esaminando il quarto argomento di (?)possiamo usare (<>)per concatenare i risultati di ciascuna funzione, ad es .:

(3?1)"Yeah" <> (2?1)"But" <> (3?2)"No"  \i-> (3?1)"Yeah" i ++ (2?1)"But" i ++ (3?2)"No" i

4

C # (compilatore interattivo Visual C #) , 105 99 94 96 89bytes

i=>{for(int x=0;x<i;)Write((x%3<1?"Yeah\n":"")+(x%2<1?"But\n":"")+(x++%3==1?"No\n":""));}

Provalo online!


4
La rimozione dell'interpolazione in questo modo consente di risparmiare 7 byte.
Emigna,

@Emigna Grazie per la punta, ha cambiato la risposta
auhmaan,

1
x++%3==1?può essere ++x%3>1?. Qualcun altro lo ha appena fornito per la mia risposta Java, ma lo stesso vale per la tua risposta C #. :)
Kevin Cruijssen,

4

Pip , 37 35 33 byte

"But 
Yeah
No
"<>5@:^[t2io02x]@<a

(Nota lo spazio dopo But). Accetta input come argomento della riga di comando. Provalo online!

Spiegazione

Questa spiegazione è per la versione precedente - vedi sotto per il log delle modifiche

Ispirato dalla risposta Perl 6 di Jo King . Costruiamo questo elenco:

[
 "Yeah
 But
 ";
 "No
 ";
 "But
 ";
 "Yeah
 ";
 "But
 No
 ";
 ""
]

e produce i primi aelementi usando l'indicizzazione ciclica.

[t2io02x]R,3["But""Yeah""No"].n@<:a
                                     i is 0; o is 1; t is 10; x is ""; n is newline;
                                     a is 1st cmdline arg (implicit)
[       ]                            Construct this list of scalars:
 t                                    10
  2                                   2
   i                                  0
    o                                 1
     02                               02
       x                              <empty string>
         R                           Treating each of these as a string, we're going to
                                     replace:
          ,3                          0, 1, and 2 (respectively)
                                     with the corresponding values from this list:
            ["But""Yeah""No"].n       These strings, each with a newline appended
                                     We now have constructed the list shown above
                               @<:a  Take the first a elements from this list, with
                                     cyclical indexing (the : is for parsing reasons)
                                     Concatenate them together and print (implicit)

Aggiornamento: mi sono reso conto che non ho bisogno di usare sostituire per cambiare 0/1/2 in stringhe - posso usare quei numeri per indicizzare direttamente un elenco. Per fare questo, dobbiamo assicurarci che i numeri a più cifre siano divisi in elenchi delle loro cifre (altrimenti, selezioneremo l'indice 10 anziché gli indici 1 e 0). Fortunatamente, l'utilizzo di un elenco arbitrariamente nidificato come indice in Pip funziona come previsto, fornendo un elenco (nidificato) dei risultati. Per input di 3, otteniamo questa progressione di dati (dove _rappresenta una nuova riga):

"But _Yeah_No_"<>5                       ["But _"; "Yeah_"; "No_"]
                     [t2io02x]           [10; 2; 0; 1; 02; ""]
                              @<a        [10; 2; 0]
                    ^                    [[1; 0]; [2]; [0]]
                  @:                     [["Yeah_"; "But _"]; ["No_"]; ["But _"]]

Come prima, il risultato finale viene concatenato insieme e stampato automaticamente.


4

Attache , 48 byte

Flat##{Mask[_%3'2'3=0'0'1,$Yeah'$But'$No]}=>Iota

Provalo online!

Spiegazione

Flat##{Mask[_%3'2'3=0'0'1,$Yeah'$But'$No]}=>Iota   input: an integer
      {                                  }=>Iota   over each number from 0 to that integer exclusive
       Mask[             ,$Yeah'$But'$No]          select values from that array according to:
            _%3'2'3                                    whether or not the input mod 3, 2, 3
                   =0'0'1                              is 0, 0, 1
Flat##                                             flatten the intermediate results

4

C (gcc) , 77 71 74 72 69 byte

C'è già una risposta C migliore qui, ma questa è ricorsiva e mi ci è voluto un po 'di tempo per mettermi dritto, quindi la sto postando.

Fino a 69 byte grazie sia a @ceilingcat che a @JonathanFrech

(Non penso mai di usare n- ~ -i al posto di n-i + 1)

i;f(n){i=n&&n-i>=~n/6&&f(n,i++,puts(i%7%4?i%7%2?"But":"No":"Yeah"));}

Provalo online!


@JonathanFrech Nice ma non funziona per zero, o 5
cleblanc

@cleblanc Oh, scusa. Non jme ne sono reso conto ... Almeno la rimozione ti ha salvato due byte.
Jonathan Frech,

1
70 byte - incorporando un byte salvato di @ ceilingcat.
Jonathan Frech,

1
n-~-iequivale a n-i+1- non i<n+1- e quindi in realtà non salva alcun byte ...
Jonathan Frech,

3

Ruby, 69 72 74 byte

->y{puts *(1..y).map{|i|[i%3==1&&:Yeah,i%2>0&&:But,i%3>1&&:No]-[!0]}}

Risposta molto diretta, cercando un metodo più breve e ricorsivo in questo momento.

Due byte salvati grazie a @BWO :)

Salvati altri tre byte utilizzando i simboli anziché le stringhe


3

Python 3, 93 byte

[print("Yeah\n"*(i%3<1)+"But\n"*(i%2<1)+"No\n"*(i%3==1),end="")for i in range(int(input()))]

Questa non è esattamente la soluzione migliore ma è la mia opinione su di essa.

Provalo online!


1
Se hai già un'espressione che puoi usare nella comprensione di una lista ma la tua comprensione di lista esiste solo per evocare gli effetti collaterali di quell'espressione, un semplice ciclo richiede meno byte.
Jonathan Frech,

3

R, 65 byte

cat(c("yeah","but","no")[c(3,1:3,2,1,2)][1:scan()%%7+1],sep="\n")

A causa del fatto che stiamo replicando un programma leggermente imperfetto (manca ogni quattro "ma" - avrebbe dovuto usare %4 == 1e %4 == 3piuttosto che %3condizioni), dobbiamo usare una chiamata scomoda ce lavorare nella base sette. Tuttavia, è più corto di LOLCODE ...

(Speravo che (3,1,2,3,2,1,2) o una permutazione simile potesse apparire nell'insieme di lhdati da qualche parte ma non sembra simile)


3

sed -E ,179 150 byte

/^0/!s:$:g:
:l;y:abcdefg:bcdefga:
/[ae]/iYeah
/[bdf]/iBut
/[cg]/iNo
s:.$:-&:;:s;s:0-:-9:;ts;h
y:123456789:012345678:;G
s:.*(.)-.*\n(.*).-:\2\1:;tl;c\ 

La parte più difficile non è stata quella di costruire l'elenco ma di analizzare effettivamente il numero decimale.

2 byte possono essere salvati se il newline alla fine non è richiesto: c\ d.

Richiede ancora ottimizzazione.

Provalo online .

Spiegazione

/^0/!                            | if the input number doesn`t begin with a '0'…
     s:$:g:                      | …then append a 'g' to it and proceed
                                 |
:l;                              | loop label 'l':
   y:abcdefg:bcdefga:            | shift all occurences of [abcdef] 1 letter forward, and all 'g'-s to 'a'-s
                                 |
/[ae]/                           | if there`s an 'a' or 'e' in the input…
      iYeah                      | …output 'Yeah'
                                 |
/[bdf]/                          | if there`s a 'b' or 'd' or 'f' in the input…
       iBut                      | …output 'But'
                                 |
/[cg]/                           | if there`s a 'c' or 'g' in the input…
      iNo                        | …output 'No' 
                                 |
s:.$:-&:;                        | insert '-' before the last character
         :s;                     | loop label 's':
            s:0-:-9:;            | transform the next consecutive '0' in the end of the number to '9', if any
                     ts;         | loop to 's' if more consecutive zeroes are available
                        h        | copy the result to the temporary buffer
                                 |
y:123456789:012345678:;          | decrement all digits except '0' (N.B.: digits, not numbers)
                       G         | append the temporary buffer to the result
                                 |
s:.*(.)-.*\n(.*).-:\2\1:;        | cut and replace the digit left to the last consecutive 0 in the original
                                 | number pasted from the temporary buffer, then discard all other digits decremented
                         tl;     | …then loop to 'l' if the number is ≥0
                            c\   | insert a carriage return and exit

Puoi aggiungere qualche spiegazione per favore?
user285259

1
@ user285259 Fatto.
hidefromkgb,


2

F #, 108 106 byte

let v p=seq{for i=1 to p do
 if i%3=1 then yield"Yeah"
 if i%2=1 then yield"But"
 if i%3=2 then yield"No"}

Provalo online!

-2 byte cambiando da i=0 to p-1a i=1 to pe modificando i moduli. A parte questo, abbastanza diretto.


1
Ottengo un qualche tipo di errore di build per il collegamento TIO, forse un errore di sintassi nel codice di test?
max

Grazie per quello La mia soluzione originale è stata stampata direttamente sulla console, ma poi ho provato a restituire una sequenza e si è rivelata più corta di circa 2 byte. Quindi ho modificato il codice nel TIO ma ho dimenticato di aggiornare il piè di pagina, che si aspettava ancora che la vfunzione stampasse tutto.
Ciaran_McCarthy,

2
Radere 2 byte con i=1 to p(e moduli di regolazione, naturalmente). Gli intervalli inversi sono vuoti. :)

Bello! L'ho aggiunto. Grazie! :)
Ciaran_McCarthy,

2

PHP, 65 68 byte

while($i<$argn)echo["Yeah
"][$i%3],["But
"][$i%2],["No
"][~-$i++%3];

Esegui come pipe -nRo provalo online .


Sembra buono, ma produce una nuova riga in più nel mezzo per n = 10
maxb

@maxb Grazie per il suggerimento. Avrei potuto risolverlo con 9 byte extra; ma l'altro approccio è più breve.
Tito,

2

VBA (Excel), 105, 101, 99 byte

Modifica: -4 byte da Keeta! Grazie!

Modifica 2: -2 byte da Chronocidal! Woot! (Compresi che i casi di test funzionavano solo per 10. Risolto ora)

Sì, questa volta Excel ha battuto VBA. Qualunque cosa. (Veniamo per te)

d=vbCr:For i=1To[a1]:a=i Mod 3:?IIf(a=1,"Yeah"+d,"")IIf(i/2=i\2,"","But"+d)IIf(a=2,"No"+d,"");:Next

^ Viene incollato nella finestra immediata e restituito alla finestra di debug

Ungolfed

d = vbCr
'For 1 to the value in A1 (using 0 gave extra values, and VBA skips the for loop if 0)
For i = 1 To [a1]    'aka: Range("A1").value
    a = i mod 3
    '? is the same as Print (Debug.Print when not in the Immediate Window)
    Print IIf(a = 1, "Yeah" + d, "") _ '<-- Just a line continuation
          'Keeta taught me that the \ operator is division with truncation,
          '     so if they are equal then there is no remainder!
          IIf(i / 2 = i \ 2, "", "But" + d) _
          IIf(a = 2, "No" + d, "");
    'Print usually prints a newline, but it still outputs if the string is blank...
    '   So we append a newline -if true- and use a semi-colon to kill the newline
Next

@Keeta buona idea, ma no ... Se guardi il mio primo codice, uso [a1] che significa Range / cell .value :) Avrei dovuto chiarire che era una spiegazione, scusa: /
seadoggie01

1
Sì, l'ho visto e ho cercato di eliminare il commento. Che ne dici di usare i / 3 = i \ 3 invece di i mod 3 = 0 (e lo stesso per mod 2 = 0). Non l'hai provato, ma funzionerebbe?
Keeta,

@Keeta Non ho mai visto l'operatore \ prima ... Non penso, però, restituisce il valore della divisione senza il resto ... come l'opposto di Mod penso
seadoggie01

Uno è divisione intera e uno è in virgola mobile. 7/3 = 2.3333 dove 7 \ 3 = 2 (divisione troncata). 6/3 dovrebbe essere 2 e 6 \ 3 dovrebbe essere anche 2, quindi dovrebbe funzionare ogni volta che il resto è zero (credo).
Keeta,

1
VBA concatenerà automaticamente le uscite delle funzioni, quindi è possibile rilasciare &ciascuna IIf(..)di esse per ulteriori 2 byte
Chronocidal

2

Gelatina , 22 byte

5Rż7FṚṁị“'⁴\ÆẓNƇ»ḲŒP¤Ẏ

Un collegamento monadico che fornisce un elenco di righe (che sembra essere stato consentito nei commenti)

Provalo online! (il piè di pagina chiama Link usandoÇe si unisce a newline usandoYpoiché la stampa implicita in Jelly distrugge tutto se possibile)

Come?

2×3=6

Ora nota che i primi sei valori sono:

["Yeah", "But"]
["No"]
["But"]
["Yeah"]
["But", "No"]
[]

Quindi l'elenco di righe risultante dovrebbe essere questi valori ripetuti (o troncati) in lunghezza nconcatenati insieme.

Ora nota che il power-set di "Yeah", "But", "No"è:

[]
["Yeah"]
["But"]
["No"]
["Yeah", "But"]
["Yeah", "No"]
["But", "No"]
["Yeah", "But", "No"]

Quindi ogni periodo corrisponde a questi valori 1 indicizzati del gruppo di potenza di "Yeah", "But", "No":

5, 4, 3, 2, 7, 1

Il codice crea questo elenco, lo modella in lunghezza n, si indicizza nel gruppo di alimentazione e quindi rimuove gli elenchi interni (che rimuove anche le stringhe vuote, poiché le stringhe sono elenchi in Jelly) ...

5Rż7FṚṁị“'⁴\ÆẓNƇ»ḲŒP¤Ẏ - Link: integer, n   e.g. 10
5                      - literal five            5
 R                     - range                   [1,2,3,4,5]
   7                   - literal seven           7
  ż                    - zip together            [[1,7],[2],[3],[4],[5]]
    F                  - flatten                 [1,7,2,3,4,5]
     Ṛ                 - reverse                 [5,4,3,2,7,1]
      ṁ                - mould like (n)          [5,4,3,2,7,1,5,4,3,2]
                    ¤  - nilad followed by link(s) as a nilad:
        “'⁴\ÆẓNƇ»      -   compressed string     "Yeah But No"
                 Ḳ     -   split at spaces       ["Yeah","But","No"]
                  ŒP   -   power-set             [[],["Yeah"],["But"],["No"],["Yeah","But"],["Yeah","No"],["But","No"],["Yeah","But","No"]]
       ị               - index into              [["Yeah","But"],["No"],["But"],["Yeah"],["But","No"],[],["Yeah","But"],["No"],["But"],["Yeah"]]
                     Ẏ - tighten                 ["Yeah","But","No","But","Yeah","But","No","Yeah","But","No","But","Yeah"]

Dubito che sarà più breve di così. Risposta fantastica e un'ottima spiegazione, ben fatto!
max

2

Python 2 , 93 92 83 byte

lambda i:''.join('Yeah\n'*(x%3<1)+'But\n'*(x%2<1)+'No\n'*(x%3==1)for x in range(i))

Provalo online!

Un enorme 9 byte risparmiati grazie a @Jonathan Frech


È possibile utilizzare la ripetizione stringa invece dell'indicizzazione tupla - ('','Yeah\n')[x%3<1]equivale a "Yeah\n"*(x%3<1).
Jonathan Frech,

@JonathanFrech - molto bello! Una tecnica simile può essere applicata anche agli altri casi. Grazie molto!
ElPedro,
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.