Scrivi un programma quadrato che emetta il numero di volte che è stato "srotolato"


22

Considera un blocco quadrato di testo, N caratteri larghi di N alto, per un numero intero dispari N maggiore di 1.

Ad esempio, lascia che N = 5 e il testo siano:

MLKJI
NWVUH
OXYTG
PQRSF
ABCDE

Si noti che questo è l'alfabeto (oltre a Z) ruotato a spirale in senso antiorario dall'angolo in basso a sinistra. È un po 'come un tappeto arrotolato.

Alfabeto a spirale

"Srotolando" il testo di un quarto di giro in senso orario, si FGHItrovano allo stesso livello dei ABCDErisultati in:

     PONM
     QXWL
     RYVK
     STUJ
ABCDEFGHI

Questo srotolamento può essere effettuato altre 7 volte fino a quando il testo non è una riga singola:

         SRQP
         TYXO
         UVWN
ABCDEFGHIJKLM

             UTS
             VYR
             WXQ
ABCDEFGHIJKLMNOP

                WVU
                XYT
ABCDEFGHIJKLMNOPQRS

                   XW
                   YV
ABCDEFGHIJKLMNOPQRSTU

                     YX
ABCDEFGHIJKLMNOPQRSTUVW

                       Y
ABCDEFGHIJKLMNOPQRSTUVWX

ABCDEFGHIJKLMNOPQRSTUVWXY

Sfida

La sfida è quella di scrivere un programma che è un blocco di testo N × N che emette il numero di volte in cui si è "srotolato" di un quarto di giro quando viene riorganizzato nei modelli di srotolamento ed eseguito.

Ci sono davvero due contest qui: (speriamo che non sia troppo disordinato)

  1. Fallo con il N. più piccolo (fino a un limite di N = 3)
  2. Fallo con il più grande N. (nessun limite)

Non ci sarà una risposta accettata ma il vincitore in ciascuna di queste categorie riceverà da me almeno 50 rappresentanti di taglie. In caso di parità vince la risposta più vecchia.

Esempio

Se il tuo blocco di codice è

MyP
rog
ram

eseguendolo così com'è dovrebbe essere visualizzato 0.

In esecuzione

   rM
   oy
ramgP

dovrebbe produrre 1.

In esecuzione

     or
ramgPyM

dovrebbe uscita 2.

In esecuzione

       o
ramgPyMr

dovrebbe uscita 3.

Infine, l'esecuzione ramgPyMrodovrebbe generare 4.

Dettagli

  • L'output deve essere stampato su stdout (o l'alternativa più vicina) da solo. Non ci sono input.
  • Puoi usare solo ASCII stampabile (codici esadecimali da 20 a 7E, che include lo spazio) nel tuo codice.
  • Gli spazi riempiono lo spazio vuoto nelle disposizioni di svolgimento. (A meno che non ti srotoli a sinistra.)
  • Solo le disposizioni da completamente quadrate a completamente piatte devono avere un output valido. Non verranno eseguiti altri accordi.
  • Non puoi leggere la tua fonte.
  • Puoi usare commenti.
  • N = 1 è escluso poiché in molte lingue il programma 0 funzionerebbe.
  • Se lo si desidera, è possibile srotolarsi a sinistra anziché a destra. Quindi ad es

    MyP
    rog
    ram
    

    diventa

    Pg
    yo
    Mrram
    

    e così via. Non vengono aggiunti spazi extra quando si rotola in questo modo. Le linee sono appena finite

(Correlato: scrivere un programma rettangolare che emette il numero di volte in cui è stato ruotato )


Prima di leggere il paragrafo "sfida", mi aspettavo una sfida per scrivere un programma che si svolgesse srotolato
John Dvorak,

1
perché N deve essere strano?
John Dvorak,

1
@JanDvorak Suppongo che N non debba essere strano, ma rende le spirali più standardizzate. Rimane così, ma sentiti libero di pubblicare un N = 2 come commento se ne trovi uno.
Calvin's Hobbies,

8
Solo un'idea: srotolare il "tappeto" a destra crea molte linee che iniziano con gli spazi bianchi, eliminando linguaggi come Python. Se consentissi lo srotolamento a sinistra, non ci sarebbe bisogno di spazi bianchi aggiuntivi e Python è (teoricamente) possibile.
Falko,

5
Hai un libro magico con infinite idee per grandi sfide? In quale altro modo continui ad affrontare sfide così interessanti?
Giustino,

Risposte:


27

Golfscript, N <- [5,7 ..]

.   .
 . . 
 ..  
.  .#
],9\-

Completamente srotolato:

],9\-#  .   .  .  . . ...

Spiegazione:

  • . (più volte): duplica l'input
  • ] - raccogliere la pila in un singolo array
  • , - prendere la sua lunghezza
  • 9\- - sottralo da 9
  • # - commento di linea

Whitespace è un NOP, ma qualsiasi altro NOP avrebbe funzionato altrettanto bene.

Completamente arrotolato, utilizza nove copie dell'input (contenuto ignorato) come stack; 9 - 9 = 0; non è stato srotolato.

Ogni srotolamento nasconde un altro punto (duplicato) dietro il commento, restringendo lo stack una volta, incrementando l'output.

Completamente srotolato, utilizza solo lo input (contenuto ignorato) come stack; 9 - 1 = 8; è stato srotolato 8 volte.

Lo stesso approccio funziona per qualsiasi N> 4: 9passa al valore appropriato di 2 * N + 1, quindi estendi il modello di punti (duplicato) usando lo stesso modello a spirale che garantisce che un punto venga srotolato esattamente durante ogni srotolamento.


Bene, a meno che qualcuno non trovi N = 3, questa sarà la risposta vincente in entrambe le categorie.
Calvin's Hobbies,

3
@ Calvin'sHobbies dovrei essere un coglione totale e pubblicare anche una soluzione srotolante? :-)
John Dvorak,

Perchè no. Un'altra risposta sembra improbabile altrimenti: P
Calvin's Hobbies,

1
Perché non sceglierne uno che può srotolarsi in entrambe le direzioni? :)
Decadimento beta

@BetaDecay hmm ... :-)
John Dvorak,

13

GolfScript, N = 4

Questo a destra arriva come da specifica originale.

.. . 
...# 
.#.~
],8-

Ecco gli srotoli:

    ...
    #..
    ..
],8-~#.

       .#.
       ...
],8-~#. ..

          ..
          .#
],8-~#. ....

            ..
],8-~#. ....#.

              .
],8-~#. ....#..

],8-~#. ....#...

Provalo qui


Come hai pensato a questo accordo?
orgoglioso haskeller il

3
@proudhaskeller È meglio se non lo sai ...
Ottimizzatore

8
Hai cercato bruto una soluzione?
orgoglioso haskeller il

Sfida speciale: puoi farne una da .s e #s?
John Dvorak,

Mi piace il finale ~. Forse posso rubarlo per N = 3?
John Dvorak,

9

APL, N = 3

201
340
5|0

srotolato:

   32
   40
5|001

     43
5|00102

       4
5|001023

5|0010234

Provalo online.

Calcola il resto di quel numero diviso per 5. Viene stampato solo il risultato dell'ultima riga.

APL, N = 2

⍬∞
≡0

srotolato:

  ⍬
≡0∞

≡0∞⍬

Provalo online.

restituisce la profondità (da non confondere con la dimensione o la lunghezza) di un array:

  • 0non è un array. Quindi la profondità è 0.
  • 0∞è un array con due elementi 0e (infinito). Ha profondità 1.
  • 0∞⍬ha un altro oggetto , che è un array vuoto con profondità 1. Quindi 0∞⍬ha profondità 2.

Questi due programmi funzionano anche nell'interprete online. Non sono sicuro che quello successivo sia sintatticamente corretto.

⍬0
≡∞


⍬¯
≡0

APL, per qualsiasi N> = 4

Per N = 4:

∞  ∞
 ∞∞
∞ ∞
⍴1↓∞

Completamente srotolato:

⍴1↓∞  ∞  ∞ ∞ ∞∞∞

Per N = 5:

∞   ∞
 ∞ ∞
 ∞∞
∞  ∞
⍴1↓ ∞

Completamente srotolato:

⍴1↓ ∞   ∞   ∞  ∞  ∞ ∞ ∞∞∞

1↓rimuove un elemento nella matrice. Restituisce anche l'array vuoto se l'argomento è scalare. ottiene la lunghezza dell'array.


Qualche spiegazione?
orgoglioso haskeller il

@proudhaskeller Edited.
jimmy23013,

Idealmente, puoi utilizzare la stessa logica di profondità per qualsiasi N. Grazie a APL
Optimizer,

@Optimizer Non è così facile. Le cose prima dell'ultima riga devono ancora essere sintatticamente corrette. Quindi non posso usare la maggior parte delle funzioni o altri caratteri di punteggiatura come ()[]appariranno in un posto indesiderato.
jimmy23013,

Intendevo come: `⍬ \ n⍬⍬0 \ n≡ ∞` (Non esattamente, ma hai avuto l'idea)
Ottimizzatore
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.