In che modo llhuii ha prodotto i numeri diabolici in 42 byte di Python?


71

Questa è una domanda di consigli per giocare a golf in Python riguardante la domanda sui numeri diabolici su Anarchy Golf .

Un numero è malvagio se la sua espansione binaria ha un numero pari di 1. La sfida è stampare i primi 400 numeri malvagi 0,3,5,...,795,797,798, uno per riga.

Le presentazioni Python 2 sono guidate da llhuii con una soluzione a 42 byte. Il successivo migliore è 46 byte per mitch, seguito da cinque invii da 47 byte. Sembra che llhuii abbia trovato qualcosa di veramente magico che ha eluso molti golfisti Python forti per oltre 2 anni. Salvare 4 o 5 byte è enorme per un golf così breve.

Tabella dei punteggi di Python 2

Sono ancora a 47 byte. Spero che possiamo rompere questo puzzle come comunità. Se riceviamo una risposta congiuntamente, la sottopongo sotto il nome di tutti coloro che hanno contribuito. Una risposta a questa domanda può essere un pezzo di codice o una nuova idea o un pezzo di analisi. Se sei llhuii, per favore non rovinarlo ancora per noi.

Sebbene i contributi non vengano rivelati perché questo problema è senza fine, ci vengono forniti alcuni suggerimenti. La presentazione vincente ha richiesto 0,1699 secondi per essere eseguita, molto più a lungo di qualsiasi altra, suggerendo un metodo inefficiente. Dalle statistiche sui byte, dei 42 caratteri, 23 sono alfanumerici [0-9A-Za-z]e 19 sono simboli ASCII. Ciò significa che non esiste spazio bianco nella soluzione di llhuii.

Puoi testare il tuo codice nella pagina del problema , scegliendo Python dal menu a discesa della lingua o caricando un .pyfile. Nota che:

  • Viene usato Python 2.7
  • Il codice deve essere un programma completo che stampa
  • Non ci sono input per questo problema, come la
  • Il tuo programma deve solo stampare i 400 valori come indicato, anche se si romperà su valori più grandi
  • I programmi hanno 2 secondi per essere eseguiti
  • I programmi potrebbero terminare con errori
  • Puoi usare exec; "exec negato" si riferisce alla shell exec

2
Potrebbe anche essere degno di nota che questa sequenza è "Indici di zeri nella sequenza Gio-Morse A010060". (fonte: oeis )
Conor O'Brien,

Risposte:


51

Questa non è la stessa soluzione di llhuii, ma è lunga anche 42 byte.

n=0;exec'print n;n^=(n^n+2)%3/2;n+=2;'*400

Provalo online!

Grazie a @JonathanFrech, ora siamo a 40 byte.

n=0;exec'print n;n=n+2^(n^n+2)/2%3;'*400

Provalo online!

C'è un altro byte da salvare, per un totale di 39.

n=0;exec'print n;n=n+2^-(n^n+2)%3;'*400

Provalo online!


1
Per curiosità, come fai a sapere che la versione a 42 byte non è la stessa di quella di llhuii? (Non ho mai partecipato ad Anarchy Golf)
Luis Mendo,

6
@LuisMendo La scheda Statistiche elenca 23 byte alfanumerici e 19 simboli ASCII, quindi non c'è spazio bianco. A meno che llhuii non abbia scritto print+n, la loro soluzione deve essere diversa dalla mia.
Dennis,

Ah, quindi puoi ottenere alcune informazioni anche se non conosci il codice. Bello. Grazie!
Luis Mendo,

Pensi che ci sia possibilità per un 38? In teoria ci sono alcuni gradi di libertà per potenzialmente rimuovere il -segno spostando con print~no print-ne utilizzare &o ~, anche se non ho ottenuto nulla a lavorare. Inoltre, n=0;exec"print n;d=n^n+2;n^=d^-d%3;"*400è carino ma 40 byte.
xnor

print-nsembra improbabile in quanto non esiste una relazione facile tra i bit impostati di ne -n. print~nsembra più promettente in teoria, ma non riesco a scendere sotto i 40 byte con questo approccio.
Dennis,

28

Ottenere 39 byte

Questa è una spiegazione di come ho ottenuto una soluzione a 39 byte, che Dennis e JonathanFrech hanno trovato anche separatamente. O meglio, spiega come si possa arrivare alla risposta col senno di poi, in un modo molto più bello del mio percorso effettivo, che era pieno di ragionamenti fangosi e vicoli ciechi.

n=0
exec"print n;n=n+2^-(n+2^n)%3;"*400

Scrivendo un po 'meno golf e con più parentesi, sembra che:

n=0
for _ in range(400):
  print n
  n=(n+2)^(-((n+2)^n))%3

Parità di bit

Partiamo da un'idea della mia soluzione a 47 byte per generare tutti i numeri del modulo in n=2*k+bcui kconta 0,1,...,399e brappresenta un bit di parità che rende il numero complessivo di 1 pari.

Scriviamo par(x)per la parità dei bit di x, ovvero xor ( ^) tutti i bit in x. Questo è 0 se c'è un numero pari di 1 bit (il numero è male) e 1 se c'è un numero dispari di 1 bit. Perché n=2*k+b, abbiamo par(n) = par(k)^b, quindi per raggiungere il male par(n)==0abbiamo bisogno b=par(k), cioè l'ultimo bit di nessere la parità dei bit dei bit precedenti.

I miei primi sforzi nel golf sono stati quelli di esprimere par(k), inizialmente direttamente con bin(k).count('1')%2, e poi con un po 'di manipolazione .

Aggiornamenti di parità

Tuttavia, non sembrava esserci una breve espressione. Invece, ha aiutato a rendersi conto che ci sono più informazioni con cui lavorare. Piuttosto che calcolare semplicemente la parità dei bit del numero corrente,

k  ---->  par(k)

possiamo aggiornare la parità bit viene incrementato ka k+1.

k   ---->  par(k)
      |
      v
k+1 ---->  par(k+1)

Cioè, dal momento che stiamo contando k=0,1,2,..., dobbiamo semplicemente mantenere la parità di bit corrente anziché calcolarla ogni volta da zero. L'aggiornamento par(k+1)^par(k)della parità dei bit è la parità del numero di bit capovolti passando da ka k+1, cioè par((k+1)^k).

par(k+1) ^ par(k) = par((k+1)^k)
par(k+1) = par(k) ^ par((k+1)^k)

Forma di (k+1)^k

Ora dobbiamo calcolare par((k+1)^k). Potrebbe sembrare che non siamo arrivati ​​da nessuna parte perché il calcolo della parità dei bit è esattamente il problema che stiamo cercando di risolvere. Ma i numeri espressi come (k+1)^khanno la forma 1,3,7,15,.., che è uno sotto una potenza di 2, un fatto spesso usato negli hack bit . Vediamo perché è così.

Quando incrementiamo k, l'effetto del carry binario è di invertire l'ultimo 0e tutto 1alla sua destra, creando un nuovo vantaggio 0se non ce ne fossero. Ad esempio, prendik=43=0b101011

      **
  101011  (43)
 +     1
  ------
= 101100  (44)

  101011  (43)
 ^101100  (44)
  ------
= 000111  (77)   

Le colonne che causano un carry sono contrassegnate con *. Questi hanno una 1modifica a un 0e trasmettere un po 'di carry 1, che continua di moltiplicazione a sinistra fino a quando non colpisce un 0a k, che cambia a 1. Eventuali bit più a sinistra non sono interessati. Così, quando k^(k+1)i controlli quale bit posizioni cambiano ka k+1, che trova le posizioni della destra 0e la 1's alla sua destra. Cioè, i bit modificati formano un suffisso, quindi il risultato è 0 seguito da uno o più 1. Senza gli zeri iniziali, ci sono numeri binari 1, 11, 111, 1111, ...che sono uno sotto una potenza di 2.

Informatica par((k+1)^k)

Ora che comprendiamo che (k+1)^kè limitato a 1,3,7,15,..., troviamo un modo per calcolare la parità di bit di tali numeri. Qui, un fatto utile è che il 1,2,4,8,16,...modulo alternativo 3tra 1e 2, da allora 2==-1 mod 3. Quindi, prendendo 1,3,7,15,31,63...modulo 31,0,1,0,1,0..., che sono esattamente le loro parità di bit. Perfetto!

Quindi, possiamo fare l'aggiornamento par(k+1) = par(k) ^ par((k+1)^k)come

par(k+1) = par(k) ^ ((k+1)^k)%3

Usando bcome variabile in cui stiamo memorizzando la parità, questo sembra

b^=((k+1)^k)%3

Scrivere il codice

Mettendo questo insieme nel codice, iniziamo ke il bit di parità bsia su 0, quindi ripetutamente stampa n=2*k+be aggiornamento b=b^((k+1)^k)%3e k=k+1.

46 byte

k=b=0
exec"print 2*k+b;b^=(k+1^k)%3;k+=1;"*400

Provalo online!

Abbiamo rimosso parentesi intorno k+1a ((k+1)^k)%3causa Python precedenza fa l'aggiunta prima in ogni caso, strano come sembra.

Miglioramenti del codice

Possiamo fare di meglio lavorando direttamente con una singola variabile n=2*k+bed eseguendo gli aggiornamenti direttamente su di essa. Fare k+=1corrisponde a n+=2. E l'aggiornamento b^=(k+1^k)%3corrisponde a n^=(k+1^k)%3. Qui, k=n/2prima di aggiornare n.

44 byte

n=0
exec"print n;n^=(n/2+1^n/2)%3;n+=2;"*400

Provalo online!

Possiamo accorciare n/2+1^n/2(ricordate che lo è (n/2+1)^n/2) riscrivendo

n/2+1 ^ n/2
(n+2)/2 ^ n/2
(n+2 ^ n)/2    

Poiché /2rimuove l'ultimo bit, non importa se lo facciamo prima o dopo lo xoring. Quindi abbiamo n^=(n+2^n)/2%3. Possiamo salvare un altro byte notando che modulo 3, /2è equivalente a *2è equivalente -, notando che n+2^nè anche così la divisione è dimezzare senza pavimentazione. Questo dan^=-(n+2^n)%3

41 byte

n=0
exec"print n;n^=-(n+2^n)%3;n+=2;"*400

Provalo online!

Infine, possiamo combinare le operazioni n^=c;n+=2in n=(n+2)^c, dove cè un po '. Questo funziona perché ^cagisce solo sull'ultimo bit e +2non si preoccupa dell'ultimo bit, quindi le operazioni commutano. Ancora una volta, la precedenza ci consente di omettere le parentesi e scrivere n=n+2^c.

39 byte

n=0
exec"print n;n=n+2^-(n+2^n)%3;"*400

Provalo online!


13

Questo dà la mia soluzione (xnor) a 47 byte e il pensiero che mi ha portato ad essa. Non leggerlo se vuoi capirlo da solo.

Una prima idea naturale è quella di scorrere i numeri da 0 a 799, stampando solo quelli con un numero pari di 1 in binario.

52 byte

for n in range(800):
 if~bin(n).count('1')%2:print n

Provalo online!

Qui, ~prende il complemento di bit in modo da cambiare even<->oddil conteggio e dare un valore di verità solo su conteggi pari.

Possiamo migliorare questo metodo generando tutti i valori invece di filtrare. Si noti che i valori di uscita sono i numeri da 0 a 399, ciascuno con un bit aggiunto per rendere uniforme il numero di 1 bit.

0 = 2*0 + 0
3 = 2*1 + 1
5 = 2*2 + 1
6 = 2*3 + 0
...

Quindi, il nnumero th è 2*n+bcon uno b=0o b=1. Il bit bpuò essere trovato contando 1i bit di ne prendendo il conteggio modulo 2.

49 byte

for n in range(400):print 2*n+bin(n).count('1')%2

Provalo online!

Siamo in grado di tagliare i 2 byte 2*ripetendo ripetutamente 0,2,4,..., il che non azzera il conteggio di 1. Possiamo farlo usando un execciclo che gira 400 volte e aumentando ndi 2 ogni ciclo.

47 byte

n=0;exec"print n+bin(n).count('1')%2;n+=2;"*400

Provalo online!

E questa è la mia soluzione a 47 byte. Sospetto che la maggior parte se non tutte le altre soluzioni a 47 byte sono uguali.


1
I tuoi 47 byte sono di execavvicinamento lungo ?
Jonathan Frech,

1
@JonathanFrech Sì, quando la pagina dice "exec negata", non si riferisce a Python execma alla riga di comando exec.
xnor

9

Presentazione di Python 3 di llhuii

Ecco le presentazioni di Python 3 per Evil Numbers al momento della stesura:

inserisci qui la descrizione dell'immagine

llhuii probabilmente ha portato il loro trucco su Python 3 e ha trovato una soluzione

  • 3 byte in più rispetto alla loro soluzione Python 2 e
  • ha 45 - (25 + 18) = 2 byte di spazio bianco.

Portando letteralmente il 47B di xnor su Python 3, otteniamo questo 50B:

n=0;exec("print(n+bin(n).count('1')%2);n+=2;"*400)

L'ho inviato come ppcg(xnor). (Aggiunge parentesi a exece print, che ora sono funzioni.) Ha statistiche di codice diverse dalle altre risposte di Python 3, che contengono tutte una certa quantità di spazio bianco. Interessante!

C'è un modo più breve per riscriverlo ( exectende a perdere il suo vantaggio competitivo in Python 3):

n=0
while n<800:print(n+bin(n).count('1')%2);n+=2

Sono 49 byte. L'ho inviato come ppcg(xnor,alternative). Questo ha due byte di spazio bianco, proprio come la risposta di llhui! Questo mi porta a credere che la risposta di Python 3 di llhuii sembra un po 'così (newline, quindi un whileciclo.) Quindi probabilmente llhuii viene usato execin Python 2 e whilein Python 3, proprio come noi; questo spiega la discrepanza degli spazi bianchi.


Il nostro 47B è diventato un 49B in Python 3. La cosa interessante, ora, è che il 42B di llhuii non è diventato un 44B, ma è diventato un 45B! Qualcosa sulla soluzione di llhuii richiede un byte in più in Python 3. Ciò potrebbe significare una varietà di cose.

  • La prima cosa che mi viene in mente è la divisione : forse llhuii usa /in Python 2, che è diventato //in Python 3. (Se stanno contando in due come noi, n/2potrebbe essere usato per ntornare a destra di un po '?)

  • L'altra cosa che viene in mente sono gli operatori unari dopo la stampa . Il nostro è print blahdiventato print(blah)(1 byte extra), ma se llhuii scrivesse qualcosa di simile print~-blahin Python 2, sarebbe diventato print(~-blah)in Python 3.

  • Forse ci sono altre idee. Per favore mi faccia sapere.

Statistiche del codice per tutte le soluzioni Py3, incluso il mio ora:

inserisci qui la descrizione dell'immagine


1
Quello che trovo interessante è che la loro soluzione Python 3 è significativamente più veloce della loro soluzione Python 2. O stanno usando alcune funzionalità di Python che sono diventate più efficienti in Python 3 o dopo tutto non è una porta semplice (forse hanno trovato una soluzione Python 3 che è più corta di una porta diretta).
Jonathan Frech,

2
I runtime su anagol hanno un'enorme varianza, ho commentato l'OP che il runtime di llhuii qui mi fa pensare che il loro runtime Py2 sia solo un'aringa rossa / outlier
Lynn

Inoltre, presumo XNOR trovato un trucco molto simile e migliorato su di essa (non ci può essere che molti modi per stampare i numeri del male, giusto ?!) e la loro soluzione è molto veloce!
Lynn,

7

Altri approcci

1) Utilizzo di una formula per A001969

Invece di convertire in binario, potrebbe essere possibile sfruttare la seguente formula (da OEIS ):

a(1) = 0
for n > 1: a(n) = 3*n-3-a(n/2) if n is even
           a(n) = a((n+1)/2)+n-1 if n is odd

Sono pessimo nel golf a Python, quindi non ci proverò nemmeno. Ma ecco un rapido tentativo in JS.

NB: Non penso che sarebbe un invio JS valido in quanto riempie semplicemente un array senza visualizzarlo. E anche così, è 5 byte più lungo dell'attuale migliore soluzione JS (che è 45 byte). Ma non è questo il punto qui.

for(a=[n=0,3];n<199;)a.push(2*++n+a[n],6*n+3-a[n])

Spero che possa dare qualche ispirazione.

L'utilizzo di un array non è probabilmente una buona idea perché deve essere inizializzato e aggiornato. Potrebbe essere più efficiente (in termini di dimensioni del codice) utilizzare una funzione ricorsiva , il che spiegherebbe perché la soluzione vincente richiede più tempo rispetto alle altre.

2) Costruire la sequenza Mar-Morse con sostituzioni

In teoria, questo codice dovrebbe funzionare:

n=0;a="1";b="0";exec"t=a;a+=b;b+=t;print(int(b[n]))+n;n+=2;"*400

Provalo online! (versione eseguibile limitata a 20 termini)

Calcola la sequenza Gio-Morse con sostituzioni consecutive e cerca la posizione di 1 (Numeri diabolici) nello stesso loop.

Ma:

  • È troppo lungo nella sua forma attuale
  • Porta rapidamente a un overflow della memoria

3) Costruire la sequenza Mar-Morse con operazioni bit a bit

A partire dalla definizione diretta della sequenza Thue-Morse di Wikipedia , sono arrivato a questo algoritmo (tornando a JS ... scusa):

for(e=n=0;n<799;)(e^=!(((x=n++^n)^x/2)&170))||console.log(n)

dove teniamo traccia dell'attuale malvagità della sequenza in e e usiamo 170 come maschera di bit di bit dispari in un byte.


Mi piace l'idea di una funzione ricorsiva, ma Python è pessimo per quella del boilerplate: f=lambda n:_ for n in range(400):print f(n)occupa già 43 byte. Forse c'è un modo per simulare la ricorsione costruendo un array che fa riferimento a se stesso o un array che aggiunge alla fine elementi futuri.
xnor

2
Inoltre, la soluzione di llhuii non ha spazi in esso, in modo da non ha usato def, for, while, lambda(con un parametro almeno), ecc
Stephen

@Stephen Qualcosa di simile while~0:print~1non richiede spazi.
Jonathan Frech,

Nel metodo numero 3, ((x=n++^n)^x/2)sembra alquanto dettagliato solo per trovare il bit impostato più basso. L'intero pasticcio può essere sostituito da ++n&-n. Provalo online!
primo

@primo Non ho idea di cosa stavo pensando qui e di come sono arrivato a questa formula ingombrante. ¯ \ _ (ツ) _ / ¯
Arnauld

5

Approccio contatori annidati

Ho un'idea per un approccio diverso, ma non ho abbastanza esperienza nel golf in pitone, quindi lo lascerò qui per voi ragazzi da considerare come un altro possibile punto di partenza per il golf.

L'idea ungolfed:

n=0
i=1
for _ in"01":
 i^=1
 for _ in"01":
  i^=1
  for _ in"01":
   i^=1
   for _ in"01":
    i^=1
    for _ in"01":
     i^=1
     for _ in"01":
      i^=1
      for _ in"01":
       i^=1
       for _ in"01":
        i^=1
        for _ in"01":
          i^=1
          if n<800:print i+n
          n+=2

Provalo online!

Nove livelli di profondità di annidamento, tutti i loop sono uguali, quindi nella mia mente dovrebbero essere costruiti da exec"something"*9+"deepest stuff". In pratica non so se è possibile fare qualcosa del genere con un ciclo for.

Cose da considerare per il golf:

  • forse c'è qualche altra possibilità di scorrere due volte oltre a un ciclo for (ho provato un approccio simile a quello di una quine con la stringa da eseguire passata a se stesso come argomento di formattazione due volte, ma la mia testa è esplosa).

  • potrebbe anche esserci un'alternativa migliore a if n<800:, che è necessaria qui perché altrimenti continueremmo a stampare numeri malvagi fino a 2 ^ 10



Forse provare le comprensioni dell'elenco nidificato anziché nidificato per i loop?
Sparr,

@Sparr Il problema è quindi quello di stampare effettivamente i numeri. In Python 2, printè un'istruzione, non una funzione, e quindi non può apparire all'interno di una comprensione.
Jonathan Frech,

forseprint '\n'.join([[[[[[[[[foo]foo]foo]foo]foo]foo]foo]foo]foo])
Sparr,

@Sparr Quindi il problema sta nell'appiattire l'elenco; str.joinfunziona solo su elenchi contenenti stringhe e i caratteri di elenco extra non devono essere stampati. La sola formattazione richiederebbe una quantità significativa di byte.
Jonathan Frech,

5

Idea: parità di bit più breve

Sono necessari molti caratteri per bin(n).count('1')%2calcolare la parità del conteggio dei bit. Forse un modo aritmetico è più breve, soprattutto se si ha una lunghezza di bit limitata.

Un modo carino della stessa lunghezza è int(bin(n)[2:],3)%2interpretare il valore binario come base 3(o qualsiasi base dispari). Sfortunatamente, 4 byte vengono spesi rimuovendo il 0bprefisso. Funziona anche da fare int(bin(n)[2:])%9%2.

Un'altra idea viene dalla combinazione di bit usando xor. Se nha una rappresentazione binaria abcdefghi, allora

n/16 = abcde
n%16 =  fghi

r = n/16 ^ n%16 has binary representation (a)(b^f)(c^g)(d^h)(e^i)

Quindi, r=n/16^n%16è cattivo se e solo se nè cattivo. Possiamo quindi ripeterlo come as s=r/4^r%4, un valore sin 0,1,2,3, di cui 1e 2non male, verificabile 0<s<3.

52 byte

n=0;exec"r=n/16^n%16;print(0<r/4^r%4<3)+n;n+=2;"*400

Provalo online!

Ciò si è rivelato molto più a lungo. Ci sono molte manopole da girare su come dividere il numero, come controllare il numero finale (forse una tabella di ricerca basata su bit). Ho il sospetto che questi possano andare solo così lontano però.


sarebbe una possibilità usare la to_bytesfunzione di numeri interi? Ne dubito, ma qualcosa da considerare :)
HyperNeutrino,

@HyperNeutrino Penso che sia solo Python 3?
xnor

yup my bad: / rip
HyperNeutrino,

9
Basta usare la 0b: int(bin(n),13)%2! : D
Noodle9

3
Progresso! Il trucco di Noodle9 offre una soluzione a 44 byte:n=0;exec"print~int(bin(n),13)%2+n;n+=2;"*400
Lynn

4

Per costruzione, n+n^nè sempre un male, ma le mie scarse abilità in Python sono riuscite a trovare solo una soluzione a 61 byte:

for n in sorted(map(lambda n:n+n^n,range(512)))[:400]:print n

Grazie a @Peilonrayz per il salvataggio di 5 byte e @ Mr.Xcoder per il salvataggio di 1 byte:

for n in sorted(n^n*2for n in range(512))[:400]:print n

55 byte : for n in sorted(n^n*2for n in range(512))[:400]:print n. n+n^nè lo stesso din^n*2
Mr. Xcoder,

3

Idea: A006068 ("a (n) è codificato in grigio in n")

L'idea di Neil di ordinare tutto ciò che 2n XOR nmi ha incuriosito, quindi ho cercato di trovare gli indici dietro questo tipo. Ho scritto questo codice e rivela che possiamo scrivere qualcosa del genere:

for n in range(400):x=a(n);print 2*x^x

Dov'è a(n)A006068 (n). Provalo online!

Tuttavia, ciò presuppone che abbiamo un modo breve per calcolare A006068. Sono già 38 byte, supponendo che possiamo calcolarlo in 4 byte (la a(n)parte). La vera implementazione (nell'intestazione TIO) è molto più lunga di quella. Non ho molte speranze per questo, credo.


3

Idea: ridurre su XOR

Se XOR tutti ninsieme, sarà 0per il male e 1per il non male. Puoi farlo con una funzione ricorsiva (che potrebbe aver richiesto così più tempo?), In questo modo:

f=lambda n:f(n/2^n&1)if n>1else-~-n

Questo restituisce 1 per il male.

Sono 35 byte e controlla se un numero è cattivo. Sfortunatamente, filtersono già 6 byte, quindi questa non è stata la soluzione ottimale alla lettera, ma questa idea può probabilmente essere giocata a golf.


Penso che tu possa fare f=lambda n:n>1and f(n/2^n&1)or-~-nper -1 byte.
Erik the Outgolfer,

@EriktheOutgolfer Ho provato ma ciò causa errori quando f(n/2^n&1)ritorna 0 ...
HyperNeutrino,

2

Metodo di sostituzione: {1 -> {1, -1}, -1 -> {-1, 1}}

Puoi anche effettuare questa sostituzione 10 volte {1 -> {1, -1}, -1 -> {-1, 1}}, quindi appiattire e controllare le posizioni di 1

ecco il codice matematica

(F = Flatten)@
Position[F@Nest[#/.{1->{1,-1},-1->{-1,1}}&,1,10],1][[;; 400]] - 1

Come lo faresti in Python?
Aneesh Durg,

2
@AneeshDurg trovi qualcosa di interessante in questa soluzione? pensa fuori dagli schemi e potresti trovare la strada per il significato della vita AKA 42
J42161217
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.