Scrivi un effetto domino


25

Utilizzando il minor numero di caratteri Unicode, scrivi una funzione che accetta tre parametri:

  • Numero totale di domino
  • ndomino interessato
  • Inclina la direzione del domino interessato ( 0o La sinistra 1o Ra destra)

Una volta che un domino viene rovesciato, deve anche rovesciare i domino rimanenti nella stessa direzione.

Dovresti produrre i domino con |rappresentare un domino in piedi \e /rappresentare un domino rovesciato rispettivamente a sinistra e a destra.

Esempi

10, 5, 1dovrebbe tornare ||||//////
6, 3, 0dovrebbe tornare\\\|||


Il terzo parametro dovrebbe essere una stringa o un bool / int farà come 0: left, 1: right?
user80551

Il tuo esempio suggerisce che se ci sono 10 domino e 5 sono rovesciati a destra, dovremmo visualizzare sei dei dieci domino rovesciati.
algoritmo

1
@algorithmshark Penso che dovremmo mostrare il risultato se il quinto domino viene bussato a destra.
user80551

@ rybo111 Puoi consentire al terzo parametro di essere un int in quanto ciò può rendere più brevi le operazioni di confronto. Semplicemente if(third_parameter)invece diif(third_paramter=='l')
user80551

Possiamo scegliere l'ordine dei parametri?
Justin,

Risposte:


14

Rubino, 38 (46) personaggi

e=->n,k,r{k-=r;'\|'[r]*k+'|/'[r]*n-=k}

Questa funzione prende la direzione come numero intero ( 1per destra, 0per sinistra). Una funzione che accetta una stringa è più lunga di 8 caratteri:

d=->n,k,r{n-=k;r<?r??\\*k+?|*n :?|*~-k+?/*-~n}

Esempi di utilizzo:

puts e[10, 5, 1] # or d[10, 5, 'r']
||||//////
puts e[10, 5, 0] # or d[10, 5, 'l']
\\\\\|||||

perché nel secondo esempio sono rimasti solo 5 domino?
Clyde Lobo,

1
@ClydeLobo Perché inizi dalla posizione 5 e batti il ​​domino a sinistra, che a sua volta getta i 4 domino alla sua sinistra, per un totale di 5. Nel primo esempio, a partire dalla posizione 5, getta 6 domini: Quello nella posizione 5 più il 5 alla sua destra.
Ventero,

8

Haskell, 70

f R i l=(i-1)#'|'++(l-i+1)#'/'
f L i l=i#'\\'++(l-i)#'|'
(#)=replicate

supponendo che v'è un tipo di direzione , che ha costruttori R e L .


8

J - 32 26 caratteri

J non può gestire più di due argomenti senza usare un elenco e non può gestire elenchi non omogenei senza boxe. Quindi avere l'input come un elenco di tre numeri interi è l'ideale. L'ordine dei parametri è il contrario di quello standard: 0 per sinistra o 1 per destra, quindi posizione, quindi numero totale di domino. La ragione di ciò è perché J finirà per attraversarli da destra a sinistra.

{`(('|/\'{~-@>:,:<:)1+i.)/

Ecco cosa sta succedendo. F`G/applicato a un elenco x,y,zvaluterà x F (y G z). y G zcostruisce entrambi i modi in cui i domino potrebbero essere rovesciati, quindi Futilizza xper selezionare quale dei due utilizzare.

Di seguito è riportato avanti e indietro con J REPL che spiega come la funzione è costruita insieme: le linee rientrate vengono immesse nel REPL e le risposte sono allineate al margine sinistro. Ricorda che J valuta rigorosamente da destra a sinistra a meno che non ci siano parentesi:

   1 ] 3 (]) 10            NB. ] ignores the left argument and returns the right
10
   1 ] 3 (] 1+i.) 10       NB. hook: x (F G) y  is  x F (G y)
1 2 3 4 5 6 7 8 9 10
   1 ] 3 (>: 1+i.) 10      NB. "greater than or equal to" bitmask
1 1 1 0 0 0 0 0 0 0
   1 ] 3 (-@>: 1+i.) 10    NB. negate
_1 _1 _1 0 0 0 0 0 0 0
   1 ] 3 (<: 1+i.) 10      NB. "less than or equal to"
0 0 1 1 1 1 1 1 1 1
   1 ] 3 ((-@>:,:<:)1+i.) 10          NB. laminate together
_1 _1 _1 0 0 0 0 0 0 0
 0  0  1 1 1 1 1 1 1 1
   1 ] 3 (('|/\'{~-@>:,:<:)1+i.) 10   NB. turn into characters
\\\|||||||
||////////
   1 { 3 (('|/\'{~-@>:,:<:)1+i.) 10   NB. select left or right version
||////////
   {`(('|/\'{~-@>:,:<:)1+i.)/ 1 3 10  NB. refactor
||////////
   {`(('|/\'{~-@>:,:<:)1+i.)/ 0 3 10
\\\|||||||

A scapito di alcuni caratteri, possiamo rendere l'ordine standard: basta aggiungere @|.alla fine della funzione:

   |. 10 3 1
1 3 10
   {`(('|/\'{~-@>:,:<:)1+i.)/@|. 10 3 1
||////////

Adattare questo per lavorare con un argomento stringa per la direzione sarebbe comunque molto più costoso.


So che è passato un po 'di tempo da quando hai scritto questa risposta, ma il modo in cui è strutturato è molto interessante. Mi piace molto il modo in cui hai utilizzato i gerundi e /anche il modo in cui crei due output e selezioni quello desiderato. Immagino di ritenere che questo non abbia il riconoscimento che merita.
Cole

Quello che ha detto @cole, ero stupito.
FrownyFrog

7

PowerShell, 66

filter d($n,$k,$d){"$('\|'[$d])"*($k-$d)+"$('|/'[$d])"*($n-$k+$d)}

Probabilmente la stessa idea che avevano tutti gli altri.

  • Accetta 0 o 1 come parametro di direzione (rispettivamente per sinistra e destra)

6

Golfscript (44 53 )

Il mio primo programma Golfscript in assoluto. Mi ha preso molto più tempo di quanto avrebbe dovuto e probabilmente può essere fatto in un modo più intelligente e più conciso (sono sicuro che qualcuno lo dimostrerà :)):

:d;:j;:^,{:x j<d&'\\'{x^j)->d!&'/''|'if}if}%

Un input di esempio è 10 5 0.

Ungolfed:

:d;:j;:^      # save input in variables and discard from stack, except total length ^
,             # create an array of numbers of length ^
{             # start block for map call
  :x          # save current element (= index) in variable
  j<          # check whether we are left of the first knocked over domino
  d           # check whether the direction is to the left
  &           # AND both results
  '\\'        # if true, push a backslash (escaped)
  {           # if false, start a new block
    x^j)->    # check whether we are on the right of the knocked over domino
    d!        # check whether the direction is to the right
    &         # AND both results
    '/'       # if true, push a slash
    '|'       # if false, push a non-knocked over domino
    if
  }
  if
}%            # close block and call map

1
Prova fatta ;-) anche se non sono ancora soddisfatto della mia soluzione.
Howard,

1
Alcuni consigli: puoi scegliere ddi essere 0/ 1invece di 'l'/ 'r'che ti dà un codice più breve. Altrimenti, se si memorizza d'l'=in una variabile, è possibile utilizzarla al posto del secondo confronto con d. Nel termine x i jè possibile salvare entrambi gli spazi bianchi se si utilizza un nome di variabile non alfanumerico anziché i.
Howard,

@Howard Grazie per i suggerimenti! Ho scelto 'l'/ 'r'perché al momento non vedevo ancora che siamo liberi di usare numeri interi. Il trucco non alfanumerico è perfetto, grazie! Forse aggiornerò la risposta più tardi.
Ingo Bürk,

4

GolfScript, 28 23 caratteri

'\\'@*2$'|/'*$-1%1>+@/=

Argomenti in cima allo stack, prova online :

> 10 5 1
||||//////

> 10 5 0
\\\\\|||||

Stupefacente. Mi piace imparare da tutte queste soluzioni di golfscript :)
Ingo Bürk,

4

Python - 45 52

Ciò richiede 1destra e 0sinistra.

x=lambda n,k,d:'\\|'[d]*(k-d)+"|/"[d]*(n-k+d)

Ecco una versione che prende re lcorrettamente, a 58 :

def x(n,k,d):d=d=='r';return'\\|'[d]*(k-d)+"|/"[d]*(n-k+d)

Alcuni esempi di utilizzo ...

>>> print(x(10,3,0))
\\\|||||||
>>> print(x(10,3,1))
||////////
>>> print(x(10,5,1))
||||//////
>>> print(x(10,5,0))
\\\\\|||||
>>> print(x(10,3,0))
\\\|||||||

4

JS (ES6) - 79 74 72 65 62

grazie a @nderscore!

Il 3o parametro è un valore booleano (0: sinistra / 1: destra)

d=(a,b,c)=>"\\|"[a-=--b,c].repeat(c?b:a)+"|/"[c].repeat(c?a:b)

// Test
d(10,3,1); // => "||////////"
d(10,3,0); // => "\\\\\\\\||"

1
questa voce potrebbe essere una carta di riferimento per ECMAScript 6: D
bebe

@bebe haha, e non è nemmeno la sua forma finale. ES6 può essere molto sporco.
XX

1
65:d=(a,b,c)=>"\\"[r="repeat"](!c&&a-b+1)+"|"[r](--b)+"/"[r](c&&a-b)
nderscore,

1
grande! Ho anche trovato questa cosa folle ma è più lunga (67): d = (a, b, c, d = a-b + 1) => "\\ |" [c] .repeat (c? B-1: d ) + "| /" [c] .repeat (c? d: b-1)
xem

Non penso che valga la pena ripetere l'aliasing. [r='repeat'][r]15 caratteri. .repeat.repeat14 caratteri
edc65,

3

Python2 / 3 - 54

L'ultimo aggiunto alla regola è stato abbastanza buono (lo 0/1 invece di 'l' / 'r'). Ha reso il mio effettivamente più piccolo della soluzione esistente di Python. 0 è a sinistra, 1 è a destra

def f(a,b,c):d,e='\|/'[c:2+c];h=b-c;return d*h+e*(a-h)

# Usage:
print(f(10,5,1)) # => ||||//////
print(f(10,5,0)) # => \\\\\|||||

3

Haskell , 42 byte

(n%k)b=["\\|/"!!(b-div(k-b-c)n)|c<-[1..n]]

Provalo online!

Prende input come (%) n k bper i ndomino, kil domino rovesciato, la direzione b.

Trova il carattere in ogni posizione cche va da 1a nusando un'espressione aritmetica per calcolare l'indice dei caratteri 0, 1 o 2.

Casi di prova presi da qui .


Haskell , 44 byte

(n%k)b=take n$drop(n+n*b+b-k)$"\\|/"<*[1..n]

Provalo online!

Una strategia interessante che si è rivelata un po 'più lunga. Genera la stringa "\\|/"<*[1..n]con ncopie consecutive di ciascun simbolo, quindi prende una porzione di ncaratteri contigui con la posizione iniziale determinata aritmeticamente.


2

Python 2.7, 68 65 61 59 58 caratteri

Utilizzare d=1per sinistra e d=0per destra

f=lambda a,p,d:['|'*(p-1)+'/'*(a-p+1),'\\'*p+'|'*(a-p)][d]

Nota: grazie a @TheRare per l'ulteriore golf.


1
Perché no d and'\\'...or'/'...?
Seequ,

Potresti anche farlo('\\'...,'/'...)[d]
vedi il

@TheRare Avrei bisogno di due di quegli elenchi.
user80551

Io non la penso così. f=lambda a,p,d:('|'*(p-1)+'/'*(a-p+1),'\\'*p+'|'*(a-p))[d]
Seequ,

@TheRare Also, I don't think your code works when falling left.Potresti dare un caso di prova per dimostrare?
user80551

2

Javascript, 46 caratteri

Sembra imbrogliare per fare 0 = le 1 = r ma c'è. Ridotto con una piccola ricorsione.

f=(a,p,d)=>a?'\\|/'[(p-d<1)+d]+f(a-1,p-1,d):''

modifica: mancava un personaggio ovvio


2

JavaScript (ES6) 61 63

Modifica Era pieno di errori - peccato per me.

Non così diverso da @xem, ma l'ho trovato da solo ed è più corto. Il parametro d è 0/1 per sinistra / destra

F=(a,p,d,u='|'.repeat(--p),v='\\/'[d].repeat(a-p))=>d?u+v:v+u

Test nella console di Firefox

for(i=1;i<11;i+=3) console.log('L'+i+' '+F(10,i,0) + ' R'+i+' '+ F(10,i,1))

Produzione

L1 \\\\\\\\\\ R1 //////////
L4 \\\\\\\||| R4 |||///////
L7 \\\\|||||| R7 ||||||////
L10 \||||||||| R10 |||||||||/

1
Dovrebbe essere --p?
nderscore,

@nderscore sì, dovrebbe, ho sbagliato i parametri, mi stupido.
edc65,

2

Perl, 67 65 personaggi

sub l{($t,$p,$d)=@_;$p-=$d;($d?'|':'\\')x$p.($d?'/':'|')x($t-$p)}

Assegna i primi tre parametri (totale, posizione, direzione come numero intero [0 sinistra, 1 destra]). Gli extra vanno nell'etere. Sottrai 1 dalla posizione se siamo diretti a destra in modo che anche il domino in posizione X sia capovolto.


1
sostituire $p--if$dcon $p-=$dper perdere due personaggi :)
cinese perl goth


2

R , 75 68 61 57 byte

Una funzione anonima. Invierò una spiegazione più completa se c'è interesse.

function(t,n,d)cat(c("\\","|","/")[(1:t>n-d)+1+d],sep="")

Provalo online!


2

Haskell , 51 byte

f a b c=("\\|"!!c<$[1..b-c])++("|/"!!c<$[b-c..a-1])

a= numero di domino, b= indice basato su 1 di quello toccato, c= direzione ( 0è a sinistra ed 1è a destra).

Provalo online!


Definizione di un operatore infisso funziona anche per più di due ingressi: (a#b)c= ....
Laikoni,

1

PHP - 64

function f($a,$b,$c){for($w='\|/';++$i<=$a;)echo$w[$c+($i>$b)];}

Un semplice ciclo e l'eco del personaggio.

Genera un Notice: Undefined variable: i, ecco un'altra versione che silenzia l'errore (65 caratteri):

function f($a,$b,$c){for($w='\|/';@++$i<=$a;)echo$w[$c+($i>$b)];}

E una versione senza errori (69 caratteri):

function f($a,$b,$c){for($w='\|/',$i=0;++$i<=$a;)echo$w[$c+($i>$b)];}

Altre funzioni in PHP:

sprintf/ printfimbottitura

function f($a,$b,$c){printf("%'{${0*${0}=$c?'|':'\\'}}{$a}s",sprintf("%'{${0*${0}=$c?'/':'|'}}{${0*${0}=$a-$b+$c}}s",''));}

imbottitura tramite str_pad/ str_repeatfunzioni

function f($a,$b,$c){$f='str_repeat';echo$f($c?'|':'\\',$b-$c).$f($c?'/':'|',$a-$b+$c);}
function f($a,$b,$c){echo str_pad(str_repeat($c?'|':'\\',$b-$c),$a,$c?'/':'|');}

usando sia printfe le str_repeatfunzioni

function f($a,$b,$c){printf("%'{${0*${0}=$c?'|':'\\'}}{$a}s",str_repeat($c?'/':'|',$a-$b+$c));}
function f($a,$b,$c){$w='\|/';printf("%'$w[$c]{$a}s",str_repeat($w[$c+1],$a-$b+$c));}

1

Scala 75 caratteri

def f(l:Int,p:Int,t:Char)=if(t=='l')"\\"*p++"|"*(l-p) else "|"*(l-p):+"/"*p

1

CJam - 20

q~
:X-_"\|"X=*o-"|/"X=*

Il codice principale si trova sulla seconda riga, la prima riga serve solo per ottenere i parametri dall'input standard (altrimenti è necessario inserire i parametri nel codice).

Provalo su http://cjam.aditsu.net/

Esempi:

12 4 1
|||/////////

8 5 0
\\\\\|||

Spiegazione:

:Xmemorizza l'ultimo parametro (direzione 0/1) nella variabile X
-sottrae X dalla posizione di knock-over, ottenendo la lunghezza della prima sequenza di caratteri (chiamiamola L)
_fa una copia di L
"\|"X=ottiene il carattere da usare per primo: \per X = 0 e |per X = 1
*ripete quel carattere L volte
ostampa la stringa, rimuovendola dallo stack
-sottrae L dal numero di domino, ottenendo la lunghezza della seconda sequenza di caratteri (chiamiamola R)
"|/"X=ottiene il carattere a usa next: |per X = 0 e /per X = 1
*ripete quel carattere R volte


1

Lisp comune

Questo non vincerà in un codice golf, ma evidenzia la direttiva sul formato di giustificazione del Common Lisp:

(lambda (n p d &aux (x "\\|/"))
   (format t "~v,,,v<~v,,,v<~>~>" n (aref x d) (+ d (- n p)) (aref x (1+ d))))

L'aritmetica non è male: nè il numero totale di domino; pè la posizione del primo domino rovesciato; dè o 0o 1, che rappresenta sinistra e destra (come consentito nei commenti) e viene utilizzato come indice in x; xè una stringa di \, |e /. La stringa di formato utilizza due direttive di giustificazione (nidificate), ognuna delle quali consente un carattere di riempimento. Così:

(dotimes (d 2)
  (dotimes (i 10)
    ((lambda (n p d &aux (x "\\|/"))
       (format t "~v,,,v<~v,,,v<~>~>" n (aref x d) (+ d (- n p)) (aref x (1+ d))))
     10 (1+ i) d)
    (terpri)))

\|||||||||
\\||||||||
\\\|||||||
\\\\||||||
\\\\\|||||
\\\\\\||||
\\\\\\\|||
\\\\\\\\||
\\\\\\\\\|
\\\\\\\\\\
//////////
|/////////
||////////
|||///////
||||//////
|||||/////
||||||////
|||||||///
||||||||//
|||||||||/

1

PHP, 89 personaggi

function o($a,$p,$d){for($i=0;$i<$a;$i++)echo$d==0?($i+1>$p)?'|':'\\':($i+1<$p?'|':'/');}

Solo perché amo PHP.

EDIT: il seguente codice fa lo stesso.

function dominoes ($number, $position, $direction) {
    for ($i=0; $i<$number; $i++){
        if ($direction==0) {
            if (($i+1) > $position) {
                echo '|';
            } else {
                echo '\\';
            }
        } else {
            if (($i+1) < $position) {
                echo '|';
            } else {
                echo '/';
            }
        }
    }
}

Hai una versione più dettagliata?
Martijn,

1
@Martijn, ho modificato il mio post per includerne uno.
TribalChief

Ora posso vedere cosa fa. Niente di speciale, ma +1 :)
Martijn,

Grazie! Le soluzioni di @NPlay sembrano fantasiose!
TribalChief

un paio di consigli sul golf: 1) Parentesi non necessarie a ($i+1>$p). 2) Riscrivere l'espressione ternaria per $d?($i+1<$p?'|':'/'):$i+1>$p?'|':'\\'salvare altri 3 byte. O semplicemente rimuovere ==0e invertire le direzioni. 3) Con $i++<$ate è possibile rimuovere $i++dalla condizione postale e utilizzare al $iposto di $i+1(-6 byte). 4) $i=0non è necessario; ma dovresti eliminare gli avvisi (opzione --n) se lo rimuovi (-4 byte).
Tito,


1

05AB1E , 19 byte

αα©„\|³è×¹®-„|/³è×J

Ho ancora la sensazione che sia un po 'lungo, ma funziona .. E meglio della soluzione iniziale di 23 byte che ho avuto con la costruzione if-else, che ho lasciato cadere rapidamente ..

L'ordine di input è lo stesso della sfida: lunghezza totale, indice, 1/0 per sinistra / destra, rispettivamente.

Provalo online o verifica entrambi i casi di test .

Spiegazione:

α                     # Take the absolute difference of the first two (implicit) inputs
                      #  i.e. 10 and 5 → 5
                      #  i.e. 6 and 3 → 3
 α                    # Then take the absolute difference with the third (implicit) input
                      #  i.e. 5 and 1 → 4
                      #  i.e. 3 and 0 → 3
  ©                   # Store this number in the register (without popping)
   \|                # Push "\|"
      ³è              # Use the third input to index into this string
                      #  i.e. 1 → "|"
                      #  i.e. 0 → "\"
        ×             # Repeat the character the value amount of times
                      #  i.e. 4 and "|" → "||||"
                      #  i.e. 3 and "\" → "\\\"
         ¹®-          # Then take the first input, and subtract the value from the register
                      #  i.e. 10 and 4 → 6
                      #  i.e. 6 and 3 → 3
            „|/       # Push "|/"
               ³è     # Index the third input also in it
                      #  i.e. 1 → "/"
                      #  i.e. 0 → "|"
                 ×    # Repeat the character the length-value amount of times
                      #  i.e. 6 and "/" → "//////"
                      #  i.e. 3 and "|" → "|||"
                  J   # Join the strings together (and output implicitly)
                      #  i.e. "||||" and "//////" → "||||//////"
                      #  i.e. "///" and "|||" → "///|||"

0

C ++ 181

#define C(x) cin>>x;
#define P(x) cout<<x;
int n,k,i;char p;
int main(){C(n)C(k)C(p)
for(;i<n;i++){if(p=='r'&&i>=k-1)P('/')else if(p=='l'&&i<=k-1)P('\\')else P('|')}
return 0;}

1
In realtà non è necessario in modo esplicito return 0da main.
zennehoy,

Non si compila per me perché cin e cout non sono nello spazio dei nomi globale - che compilatore stai usando? Inoltre, C(n)>>k>>psarebbe in corto di quanto C(n)C(k)C(p)non sarebbe? E se la definizione di P () potesse stringere l'argomento non salverebbe i caratteri per tutte le virgolette? E quando si confronta p con 'l' e 'r': 0 e 1 sarebbero più brevi, in particolare> 0 invece di == 'r' e <1 invece di == 'l' (supponendo che tu stia bene usando numeri invece di r / l - in caso contrario <'r' è ancora più corto di == 'l' e> 'l' è ancora più corto di == 'r')
Jerry Jeremiah

@JerryJeremiah per cin e cout necessitano "usando lo spazio dei nomi std".
bacchusbeale,

Lo so, ma poiché viene utilizzato solo due volte, è più breve qualificare le funzioni. In nessun caso funziona sul mio compilatore senza includere.
Jerry Jeremiah,

0

PHP - 105,97 , 96

 function a($r,$l,$f){$a=str_repeat('|',$l-$f);$b=str_repeat($r?'/':'\\',$f);echo$r?$a.$b:$b.$a;}

Risultati di esempio:

a(true,10,4);  -> \\\\||||||
a(false,10,5); -> |||||/////
a(false,10,2); -> ||||||||//

0

Javascript, 81 85 caratteri

funzione e (a, b, c) {l = 'repeat'; d = '|' [l] (- a-b ++); return c> 'q'? d + "/" [l] (b): "\\" [l] (b) + d}

Prima volta che ho provato Codegolf, è stato divertente grazie :)


Potrebbe anche modificare la funzione per essere una funzione ES6, poiché la ripetizione della stringa è ES6 (non funziona in Chrome).
Matt,

0

JavaScript - 85 caratteri

function d(a,b,c){for(r=c?"\\":"/",p="",b=a-b;a--;)p+=c?a<b?"|":r:a>b?"|":r;return p}

1 = Sinistra, 0 = Destra

d(10,3,1)
\\\|||||||
d(10,3,0)
||////////
d(10,7,1)
\\\\\\\|||
d(10,7,0)
||||||////

0

Clojure, 81 caratteri

(defn g[a,p,d](apply str(map #(nth "\\|/"(+(if(>= % (- p d)) 1 0) d))(range a))))

0

vb.net (~ 75c)

Dim f=Function(l,p,d)(If(d="l",StrDup(p,"\"),"")& StrDup(l-p-If(d="l",1,0),"|")).PadRight(l,"/")
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.