Cardinale Code Challenge


24

Compito

Sei incaricato di creare una bussola, in qualche modo.

Immagina il tuo codice sorgente come "ago" della bussola in cui correre con orientamenti diversi produce un output distinto.

Gli orientamenti del codice sorgente supportati sono Nord, Est, Sud e Ovest.

Esempio

Supponiamo che tu abbia il codice sorgente:

ABCD
 J K
WXYZ

Considereremo questo l'orientamento a nord, ruotando di 90 gradi in senso orario ci indica verso est:

W A
XJB
Y C
ZKD

ruotando di nuovo punti verso sud:

ZYXW
K J 
DCBA

e, infine, l'ultima rotazione verso ovest:

DKZ
C Y
BJX
A W

Quando eseguito, ciascuno degli esempi di codice sopra riportati dovrebbe generare un singolo carattere ASCII stampabile distinto di propria scelta.

Gli appunti

Il tuo codice non deve contenere input.

Gli spazi vuoti o le nuove linee non collassano / scompaiono durante la rotazione.

Le nuove righe iniziali / finali vanno bene nell'output.

Le risposte possono essere interi programmi o funzioni, quindi essere inviati a STDOUT o restituire il risultato della funzione.

Si applicano le regole standard del ; vince la risposta più breve in byte!


Possiamo produrre più di 1 carattere?
Mr. Xcoder,

1
Dobbiamo riempire il codice di spazi in modo che sia un rettangolo perfetto (e contiamo quegli spazi nel nostro punteggio)? Ad esempio, sarebbe di codice a forma questo sia valido, dato il primo è la presentazione?
Business Cat

2
A parte le specifiche di output, penso che questo sia un duplicato
Digital Trauma

1
@BusinessCat Non è necessario riempire il codice per creare un rettangolo - quell'esempio che hai fornito sarebbe valido.
CzarMatt

4
@ Mr.Xcoder Um, come hanno potuto 4 programmi identici stampare 4 caratteri ASCII diversi?
ETHproductions

Risposte:


20

Gelatina , 2 byte

*2

Provalo online!

Si noti che la voce principale per un programma Jelly è il suo ultimo collegamento, in cui qualsiasi carattere di nuova riga dividerà i collegamenti), nessuno dei due programmi di linea effettivamente accede al loro collegamento superiore.

I quattro programmi completi, che implicitamente stampano il loro risultato, sono:

Nord :

*2   -> (implicit) zero raised to the power of 2 = 0

Est :

*
2    -> literal 2 = 2

Sud :

2*   -> two raised to the power of (implicit) 2 = 4

Ovest :

2
*    -> (implicit) zero raised to the power of (implicit) zero = 1

1
Questa è la risposta finale. Molto bene.
Erik the Outgolfer

19

Japt , 3 2 byte

gy

In qualche modo, in qualche modo , ho trovato una soluzione estremamente caotica a 2 byte ...


Uscite nord0 :

gy

Poiché non vi è alcun input implicito, per impostazione predefinita è 0. gsu un numero restituisce il segno del numero indipendentemente dai suoi argomenti ( "y"in questo caso).


Uscite est2 :

g
y

In un programma multilinea, la prima riga imposta l'input sul suo risultato. Questo è fondamentalmente un no-op, dal momento che gil 0IS 0. Quindi yrestituisce il GCD di 0e ... poiché manca un argomento, il valore predefinito è 2(grazie, @Oliver !). Questo dà 2come output.


Uscite sudg :

yg

y, come prima, è GCD. Poiché gcd (0, x) è x per qualsiasi valore, yon si 0prende la libertà di restituire il suo argomento. In questo caso, l'argomento è "g", che è il risultato.


Uscite ovest1 :

y
g

ysu 0, come prima, ritorna 2. Questo viene quindi passato a g, che (come già discusso) è la funzione di segno sui numeri. Pertanto, il risultato è 1.


8

Java (OpenJDK 8) , 7309 4421 855 byte

-2888 byte grazie a Leaky Nun
-3566 byte grazie a Wheat Wizard

//i/////////////////////////////////////////////////////////////
//n//////////////////////////////////////////////////////////////////
interface M{static void main(String[]a){System.out.println(0);}}/////
//e//}};)2(nltnirp.tuo.metsyS{)a][gnirtS(niam diov citats{M ecafretni
//r//////////////////////////////////////////////////////////////////
//f}/////////////////////////////////////////////////////////////////
//a}//
//c;//
//e)//
// 3//
//M(//
//{n//
//sl//
//tt//
//an//
//ti//
//ir//
//cp//
// .//
//vt//
//ou//
//io//
//d.//
// m//
//me//
//at//
//is//
//ny//
//(S//
//S{//
//t)//
//ra//
//i]//
//n[//
//gg//
//[n//
//]i//
//ar//
//)t//
//{S//
//S(//
//yn//
//si//
//ta//
//em//
//m //
//.d//
//oi//
//uo//
//tv//
//. //
//pc//
//ri//
//it//
//na//
//tt//
//ls//
//n{//
//(M//
//1 //
//)e//
//;c//
//}a//
//}f//
///r//
///e//
 //t//
 //n//
 //i//

Provalo online!

Vecchia versione

Un semplice approccio con commenti che racchiudono il codice ^ 2 quadrato, questo può essere fatto praticamente in qualsiasi lingua.
un esempio (più leggibile) in Python

##p#####
# r  2 #
print 1#
# n  t #
# t  n #
#4 tnirp
# 3  r #
#####p##

Grande valutazione generale, ora devo solo capire come farlo! :)
flawr

È possibile utilizzare interface M{static void main(String[]a){System.out.println(0);}}invece per salvare alcuni byte.
Leaky Nun


1
@MagicOctopusUrn non è stato fatto a mano c;
Rod

1
@MagicOctopusUrn nah, ho fatto questa risposta per mostrare questo algoritmo, il linguaggio è irrilevante: 3
Rod

7

Brain-Flak , 33 byte

##)(##))()()  ((
((  ))##    ()##

Provalo online!

Brain-Flak , 33 byte

##)     ## #
(( ))#)())()
  # ( (

Provalo online!

Brain-Flak , 36 byte

#)##     ## #
  (())#)())()
 #   ( (

Provalo online!

Brain-Flak , 38 byte

######  (#
(()()())#))((
       #(  ##

Provalo online!

Brain-Flak , 41 byte

##(#####(#
(()()())#
##))()((
####((#)#)#

Provalo online!


Merda santa! Ci stavo lavorando, ma non riuscivo ad arrivare da nessuna parte. Ho pensato che ci sarebbero voluti almeno 30-40 minuti di lavoro per capire qualcosa. Questo è fantastico!
DJMcMayhem

1
Questo è molto bello!
CzarMatt

Stai cercando di giocare a golf: finora hai 3 di loro che lavorano
Christopher,


5

Befunge, 17 13 byte

Ho pensato che Befunge sarebbe stato divertente per un problema geometrico. C'è una banale soluzione 4x4 simile agli altri qui (ho bisogno di 3 comandi) ma sono riuscito un po 'meglio.

Modifica: dimenticato di newline

Modifica 2: realizzato che potrei creare un gatto

Modifica 3: il gatto è morto

2v3
@.v
.  
1@.

Gattino RIP: <

1.@ 2
^._.^
3 @.4

5

05AB1E , 5 3 byte

Y'X

Nord , Est , Sud , Ovest


Impressionante, è stato veloce!
CzarMatt

@MagicOctopusUrn Penso Y'Xche funzionerà, ma devo provarlo ancora.
Riley,

Lo fa anche @Riley, funziona anche avanti e indietro, Y'Xè valido. Comunque sto ancora cercando un 2 byte; nessuno dei "punti comandi" funziona, quindi dubito che esista.
Magic Octopus Urn l'

@MagicOctopusUrn Non penso che ci sia una soluzione a 2 byte con il modo in cui funzionano le newline. Tuttavia, non sarebbe difficile brutare la Forza.
Riley,

10avrebbe funzionato se avessero permesso più caratteri per un output; P. *
Magic Octopus Urn l'

4

C (gcc) , 283 279 209 byte

/////////)pm//
/////////;ua//
main(){//}ti//
puts("N"//sn//
);}///////((//
//////////")//
///"//////W{//
///E//////"///
//)"//////////
//((///////};)
//ns//"S"(stup
//it}//{)(niam
//au;/////////
//mp)/////////

Provalo online!

Lo stesso vecchio trucco di commento qui, ma almeno, in C questo non è huuuge ;)


Hai bisogno di una delle quattro barre sul bordo destro proprio sopra lo spazio?
ETHproductions

Ehi .. uhm ... immagino, in realtà ... no. Buona cattura, grazie :)
Felix Palmen

Penso che puoi metterlo insieme un po 'più stretto spostando ciascuno );}sulla riga sottostante, in questo modo (non ho testato le rotazioni)
ETHproductions

Oh, il Wprogramma nella tua configurazione attuale al momento fallisce perché c'è un extra sndopo il codice reale. Apparentemente puoi risolvere questo problema cambiando la barra proprio prima della pmriga superiore in un punto e virgola.
ETHproductions

uhh ... probabilmente è tempo di cancellare questo e ricominciare da capo: o (la prima versione era un quadrato di barre, ma pensavo che avrei fatto una cosa " intelligente " salvando alcuni byte ... dannazione)
Felix Palmen,

4

Labirinto , 9 byte

!
2@2
 !)

Stampe 0. Provalo online!

 2)
 @!
!2

Stampe 3. Provalo online!

)!
2@2
  !

Stampe 1. Provalo online!

 2!
!@
)2

Stampe 2. Provalo online!

Spiegazione

Ogni programma inizia dal primo non spazio nell'ordine di lettura (ovvero il carattere in alto a sinistra o in alto al centro), spostandosi verso est. Per il primo programma:

!   Print an implicit zero.
    The IP can't move east, so it moves south instead.
2   Push a 2.
    The IP can't keep going south, so it turns east instead.
@   Terminate the program.

Per il secondo programma:

2   Push a 2.
)   Increment it to 3.
    The IP can't keep going east, so it turns south instead.
!   Print the 3.
    The IP can't keep going south, so it turns west instead.
@   Terminate the program.

Per il terzo programma:

)   Increment an implicit zero to 1.
!   Print the 1.
    The IP can't keep going east, so it turns south instead.
@   Terminate the program.

Per il quarto programma:

2   Push a 2.
!   Print the 2.
    The IP can't keep going east, so it turns back around to move west.
2   Push another 2.
    The IP can't keep going west, so it turns south instead.
@   Terminate the program.

4

Wumpus , 7 byte

O@$
)))

Stampe 0. Provalo online!

)O
)@
)$

Stampe 1. Provalo online!

)))
$@O

Stampe 3. Provalo online!

$)
@)
O)

Stampe 2. Provalo online!

Spiegazione

Il primo programma è abbastanza semplice: Ostampa uno zero implicito e @termina il programma.

A partire dal secondo programma, dobbiamo esaminare il layout della griglia triangolare per comprendere il flusso di controllo:

enter image description here

)   Increment an implicit zero to 1.
O   Print the 1.
))  Two irrelevant increments.
@   Terminate the program.

Per il terzo programma:

enter image description here

))) Increment an implicit zero to 3.
O   Print the 3.
@   Terminate the program.

Il quarto è dove diventa davvero funky. Le linee tratteggiate indicano celle che non sono eseguite perché vengono ignorate da $:

enter image description here

$   Skip the ).
$   Skip the @.
))  Increment an implicit zero to 2.
O   Print the 2.
))  Two irrelevant increments.
@   Terminate the program.

Super cool, anche diagrammi fantastici.
CzarMatt,

3

PowerShell , 20 11 byte

#4#
1#3
#2#

Abusa dei commenti ( #) come pazzi, e il fatto che un singolo numero inserito nella pipeline ottenga un output così com'è. Le stampe sopra 1. Provalo online!

Da qui, puoi facilmente vedere che ogni rotazione produce solo un numero che si trova sulla "sinistra" dei commenti, e quindi c'è un solo numero che verrà emesso per rotazione.

Salvato 9 byte grazie a Wheat Wizard !


Non so PowerShell, ma non sarebbe questo lavoro?
Wheat Wizard

@WheatWizard Sì, davvero. Grazie!
AdmBorkBork,

3

Stellato , 34 byte

  zz  
  +   
   .  
    + 
      

O con spazi mostrati come trattini in modo da poterli vedere:

--zz--
--+---
---.--
----+-
------

Provalo online!

I comandi in Starry sono +, .e alcune altre cose, e ciò che fanno è determinato da quanti spazi ci sono prima di loro: a +con n spazi spinge n −5 nella pila e .con un numero pari di spazi lo stampa. Le zs e le nuove righe vengono completamente ignorate.

Ci sono 6 spazi prima del primo, +quindi spinge 6−5 = 1 e il. stampa.

E le rotazioni:

-----
-----
---+z
--.-z
-+---
-----

Provalo online! Questo stampa "8".

------
-+----
--.---
---+--
--zz--

Provalo online! Questo stampa "2".

-----
---+-
z-.--
z+---
-----
-----

Provalo online! E questo stampa "3".


Che lingua ordinata. Inoltre, non ho mai detto che devi riempire con spazi bianchi per formare un rettangolo. Ma se la tua fonte si basa sugli spazi, allora suppongo che tu debba contarli.
CzarMatt

@CzarMatt, grazie per il chiarimento! Ho aggiornato il post.
Non un albero il


2

Lotto, 90 byte

 :: :::@:
:&s ohce@
:e   : c:
      :h:
:o     o:
:h:
:c :   w:
@echo n&:
:@::: ::

Batch non ha davvero un carattere di commento. Per i commenti a riga intera, :funziona, poiché introduce un'etichetta, ma ho ancora bisogno di qualcosa per terminare il echocomando pur essendo una non-operazione quando invertito. &:sembra funzionare, che è tutto ciò di cui ho bisogno qui, ma confonde davvero Batch, sbagliando se non metto un :prima @sulla riga successiva e anche in qualche modo dimenticare di stampare una nuova riga.


2

MATLAB, 29 17 5 11 byte

Avendo capito che la domanda richiedeva singoli caratteri ASCII non solo un output distinto, ecco un approccio MATLAB che farà proprio questo:

%4%
1%3
%2%

Ciò stamperà implicitamente 1, 2, 3 o 4 a seconda della rotazione.


Pensaci, funzionerebbe anche in MATL. Stesso numero di byte del mio, però.
Sanchises,



1

JS, 17 B

//1//
2///4
//3//

Uscite:
Nord: 2,
Est: 3,
Sud: 4,
Ovest: 0.33333333333….
(come in: 2, 3/1, 4, 1/3)


Benvenuti in PPCG! Non penso che questo sia valido, come in un ambiente non REPL, il numero non verrà visualizzato. (Potrei sbagliarmi lì)
Zacharý

(Basta aggiungere REPL dopo JS, quindi penso che
vada

1
L'output dovrebbe essere un singolo carattere ASCII stampabile, quindi come il mio MATLAB, questo non è valido.
Tom Carpenter,

1

Scusa, volevo dire:

//0//
////
 1/2
/////
//3//

e 28B. E produce 0,5, 3, 2, 0.


Benvenuti in PPCG! Dovresti inserire il nome della lingua e il conteggio dei byte in un'intestazione. E questo è uno snippet, non un programma completo o una funzione, che non è valido. (Potrei sbagliarmi)
Zacharý

@ Zacharý Penso che codegolf.meta.stackexchange.com/questions/7842/… afferma che i REPL sono ammessi
SuperStormer

Ad ogni modo, dovrebbero specificare che si tratta di un JPL REPL.
Zacharý,

2
L'output dovrebbe essere un singolo carattere ASCII stampabile, quindi come il mio MATLAB, questo non è valido.
Tom Carpenter,

1

JavaScript (ES6), 86 byte

Emette 0 per Nord, 1 per Est, 2 per Sud e 3 per Ovest.

////  _//
////  =//
_=>0//>//
  ////1//
  // //
//3////
//>//2>=_
//=  ////
//_  ////


1

MATL , 11 byte

HxI
xFx
TxK

Provalo online!

Cominciamo in MATL. La sfida principale è che MATL fallisce solo se una funzione richiede input se lo stack è vuoto. Forse qualcosa di intelligente con i modificatori come X, Y, Ze &potrebbe fare per qualcosa di più breve, ma non ho potuto trovare una combinazione adatta.

Spiegazione: tutti i caratteri inseriscono un singolo numero intero nello stack e li xrimuove tutti tranne l'ultimo.


1

Perl, 49 byte

48 byte codice + 1 per -p.

Presuppone input vuoti che TIO non supporta, quindi una nuova riga viene aggiunta al suo posto e non utilizzata. Stampe N , E , S , W .

# ####
#S= _$
#; W#
 $_=N#
#_ _#
#= $#
#E#
 ## #

Provalo online!


1

C (gcc) , 120 byte

Avevo sperato in una maggiore sinergia tra le varianti.

//}=)f8 ///
// c{(7 ///
   ;rr; //}
        ;c=
78; /// r{)
f(r /// r(f
){r /// ;38
=c;
}// ;rr;
/// 9({c //
/// 6f)=}//

Nord

est

Sud

ovest

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.