Stampa tutti i quadrati bianchi o neri di una scacchiera


29

introduzione

Ecco come appare una scacchiera.

inserisci qui la descrizione dell'immagine

Puoi vedere che a1è un quadrato scuro . Tuttavia, b1è un quadrato chiaro .

L'obiettivo

La sfida è, data dark, lighto both, emettere tutto il buio , la luce o tutti i quadrati con un separatore (come uno spazio bianco o una nuova riga). L'ordine di tutti i quadrati non ha importanza .

Casi test

Input: dark
Output: a1 a3 a5 a7 b2 b4 b6 b8 
        c1 c3 c5 c7 d2 d4 d6 d8 
        e1 e3 e5 e7 f2 f4 f6 f8 
        g1 g3 g5 g7 h2 h4 h6 h8

Input: light
Output: a2 a4 a6 a8 b1 b3 b5 b7 
        c2 c4 c6 c8 d1 d3 d5 d7 
        e2 e4 e6 e8 f1 f3 f5 f7 
        g2 g4 g6 g8 h1 h3 h5 h7

Input: both
Output: a1 a2 a3 a4 a5 a6 a7 a8
        b1 b2 b3 b4 b5 b6 b7 b8
        c1 c2 c3 c4 c5 c6 c7 c8
        d1 d2 d3 d4 d5 d6 d7 d8
        e1 e2 e3 e4 e5 e6 e7 e8
        f1 f2 f3 f4 f5 f6 f7 f8
        g1 g2 g3 g4 g5 g6 g7 g8
        h1 h2 h3 h4 h5 h6 h7 h8

Nota: ho preimpostato l'output ma questo non è necessario .

Questo è , quindi vince l'invio con il minor numero di byte!


Quindi, qualcosa del genere a2a4a6...andrebbe bene?
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Deve contenere un separatore, come uno spazio bianco o una nuova riga, quindi non è valido.
Adnan,

Possiamo produrre una matrice 2d grezza? Vale a dire[[a2,a4,a6,a8],[...]...]
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Sì, è consentito
Adnan,

light, darke bothdevono essere inseriti come Stringse possono essere rappresentati tramite qualsiasi tipo di dati?
WKS,

Risposte:


15

Pyth, 22 21 byte

-1 byte di @ Sp3000

fn%Chz3%sCMT2sM*<G8S8

Sotto la funzione %Chz3, gli darkhash a 1, lighta 0 e botha 2. Se prendiamo la parità della somma degli ordini di un quadrato di scacchi (cioè, a1-> [97, 33]-> (97 + 33)%2= 0, i quadrati scuri vanno a 0 e la luce a 1 Questo ci consente di filtrare per disuguaglianza.

fn%Chz3%sCMT2sM*<G8S8      implicit: z=input
               *           Cartesian product of
                <G8          first 8 letters in G (alphabet)
                   S8        with [1,...,8] implicitly stringified
             sM*<G8S8      ['a1','a2,...,'a8','b1'...'h8']
f          T               Filter that by gives truthy result to lambda T:
        sCMT                   The sum of the ords of the chars in T,
       %    2                  modulo 2
 n                            does not equal
   Chz                          ord of the first char in z,
  %   3                         modulo 3
                            Implicitly print the list.

Provalo qui .


21:fn%Chz3%sCMT2sM*<G8S8
Sp3000,

@ Grazie Sp3000! Sapendo che stavo usando 6 byte per adattarlo, avrei dovuto provare diversi hash.
lirtosiast,

13

Utilità Bash + GNU, 74

printf %s\\n {a..h}{1..9}|sed -n "`sed '/[db]/a1~2p
/t/a2~2p
c/9/d'<<<$1`"

{a..h}{1..9} è un'espansione bash che produce tutte le coordinate per una scheda 8x8, più una colonna aggiuntiva 9 . Questo è importante perché rende la lunghezza della riga dispari che consente l'effetto chequerboard.

Il printf semplicemente formati ciascuna coordinata, uno per riga.

L'espressione sed creata quindi elimina tutte le x9coordinate e quindi stampa le linee di input pari o dispari o entrambe, in base all'input dello script.


11

JavaScript (SpiderMonkey 30+), 90 85 83 82 byte

x=>[for(d of"12345678")for(c of"abcdefgh")if(x>'l'^parseInt(c+=d,19)%2|x<'d')c]+''

Restituisce una stringa di quadrati separati da virgola. Versione compatibile per 99 byte:

x=>([..."12345678"].map(d=>[..."abcdefgh"].map(c=>c+d).filter(s=>x>'l'^parseInt(s,19)%2|x<'d')))+''

Lavora enumerando tutti i 64 nomi quadrati, quindi analizzandoli nella base 19 per vedere se sono chiari o scuri modulo 2.


Buono. Questo è ES7
edc65,

@ edc65 Ah, non me lo ricordavo. Presumo che la mia seconda versione sia "solo" ES6.
Neil,

Ora ES6 batte ES7
edc65 il

@ edc65 Stavi dicendo?
Neil,

4
@ edc65 Non credo che potremmo essere d'accordo su un pareggio?
Neil,

10

JavaScript (ES6), 82 87 98

Funzione anonima che restituisce una stringa di quadrati separata da spazio.

i=>eval("for(o='',v=190;v<322;)v++%19<8&&i<'d'|v&1^i>'l'?o+=v.toString(19)+' ':o")

TEST

f=i=>eval("for(o='',v=190;v<322;)v++%19<8&&i<'d'|v&1^i>'l'?o+=v.toString(19)+' ':o")

// less golfed

q=i=>{
  // loop over the range of number a0 (base 19) to h8 (base 19)
  for(o='',v=190;v<322;) 
  {
    if (v++ %19 < 8) // increment and execute the line below only if second digit in 1..8
      if (i<'d'|v&1^i>'l') // even == light, odd == dark, take both if input is 'both'
        o+=v.toString(19)+' '
  }
  return o
}

document.write('<hr>Both<br>'+f('both'))
document.write('<hr>Light<br>'+f('light'))
document.write('<hr>Dark<br>'+f('dark'))


1
Wow ... è semplicemente pazzo! Mi chiedo se sia possibile accorciarlo con ES6 ...
ETHproductions

@ETHproductions sì, lo è! Ho un 86 pronto, ma sto ancora cercando di fare qualcosa di meglio (il mio - commovente - bersaglio è Neil con 85 ... no dannatamente 83)
edc65,

7

Lotto, 192 byte

@set s=a1 a3 a5 a7
@set t=b2 b4 b6 b8
@if not %1==light call:b
@set s=a2 a4 a6 a8
@set t=b1 b3 b5 b7
@if %1==dark exit/b
:b
@echo %s% %s:a=c% %s:a=e% %s:a=g% %t% %t:b=d% %t:b=f% %t:b=h%

4

Pyth, 48 39 byte

K*<G8S8Jfq%xGhT2%seT2K?qhz\bK?qhz\lJ-KJ

Provalo qui!

Ancora più lungo dell'altra soluzione Pyth, ma non credo di poterlo battere con il mio algoritmo.

Spiegazione

Innanzitutto generiamo un elenco di tutti i quadrati sul tabellone e lo assegniamo a Y. Quindi filtriamo questo elenco in modo che rimangano solo i quadrati chiari e assegniamo questo elenco J. Successivamente valutiamo l'input e stampiamo:

  • Y se l'input era both
  • J se l'input era light
  • Y-J se l'input fosse dark

Determinare se un quadrato è leggero funziona come segue:

  • Mappa il carattere su un numero compreso tra 1 e 8 (a-> 1, b-> 2), risultati in 18per a8, ecc.
  • controlla se entrambi questi numeri sono pari o dispari ( x%2 == y%2)
  • Se lo sono, il quadrato è leggero, altrimenti è scuro

K*<G8S8Jfq%xGhT2%seT2K?qhz\bK?qhz\lJ-KJ  # z=input

 *                                         # Cartesian product of
  <G8                                      # first 8 letters of the alphabet (a-h)
     S8                                    # 1-indexed range (1-8)
K                                          # K holds now all squares
       f             K                     # Filter K 
        q                                  # is equal
         %xGhT2                            # map [a-h] to a number [1-8] and take it modulo 2
               %seT2                       # Take modulo 2 from the row number
                      ?qhz\bK              # If input starts with 'b' print K
                             ?qhz\lJ       # If it starts with 'l' print J
                                    -KJ    # Otherwise print the difference of those 2

Oh cavolo che è più corto del mio da un colpo lungo.
Addison Crump,

4

Python 2, 73 71 70 byte

lambda s:[chr(x/8+97)+`x%8+1`for x in range(64)if x+x/8&1^ord(s[0])%3]

Sono ancora un po 'confuso se le funzioni vanno bene per la domanda, poiché la sfida menziona un "separatore", ma dato che ci sono molte altre presentazioni di funzioni ho fatto lo stesso.

Simile alla risposta di Erwan ma con molto più Python 2-ness.

(-2 byte grazie a @xnor)


lol Non provo nemmeno tra s=="dark"e s[0]=="d"ma per la mia difesa nel mio primo tentativo che ho usato s,*_=se 4cmp
Erwan

1
Sento che dovrebbe esserci qualcosa di più corto come ord(s[_])&_o ord(s[_])/_.
xnor

@xnor In effetti, c'è con %:) Grazie!
Sp3000,

4

PHP, 132 126 120 108 106 byte

for($s=strtr($argv[1],bdl,210);$c<8;$c++)for($r=0;$r<8;)if((++$r+$c)%2==$s||$s>1)echo"abcdefgh"[$c]."$r ";

Passa attraverso i col (0-7) e le righe (1-8) e controlla se la somma di entrambi è pari / dispari.

Testato con PHP 5.6.4, eseguilo: php -d error_reporting=30709 -r '<CODE>' {dark|light|both}


1
Benvenuti in PPCG! Questa è una buona risposta, ma otterrai più voti se aggiungi una spiegazione.
lirtosiast,

Penso che puoi sostituirlo $s==2con $s-1. Se $ s = 2 e -1, è 1, il che è vero e continuerà
Martijn,

E penso che $c=0possa essere $c, darà un sacco di avvisi, ma almeno per il buio funziona benissimo
Martijn,

Grazie, Martijn! Ho dimenticato di rimuovere anche le parentesi graffe, -6 byte per ora. E non so perché, ma $s-1non funziona, ma dovrebbe. Grazie per questa fantastica idea! Lo debug più tardi.
Killerbees19,

Sono nuovo di questo sito, ma i messaggi di errore a causa della $cvariabile non definita ? Sembra un po 'strano e non valido. O no?
killerbees19

3

Vitsy , 90 82 byte

'`'8\[1+8\:]Yy1-\?8\['1'v8\[vD1+vr?]vX]i'h'-)[88*\[Z?aO]]i'r'-)[?1m]1m
84*\[Z??aO]

Spiegazione della prima riga:

'`'8\[1+8\:]Yy1-\?8\['1'v8\[vD1+vr?]vX]i'h'-)[88*\[Z?aO]]i'r'-)[?1m]i'g'-)[1m]
'`'                     Push ` to the stack. (this is 1 less than a in ASCII)
   8\[     ]            Do the stuff in brackets 8 times.
      1+                Add one on every recursion (this gets a, b, c, d...)
        8\:             Clone the stack 8 times. (This gets 8 of each a, b, c...)
Y                       Remove the current stack.
 y1-\?                  Go one stack to the left (I really need to builtin this)
8\[                 ]   Do the stuff in brackets 8 times.
   '1'                  Push character literal 1 to the stack.
      v                 Save it as a temporary variable.
       8\[       ]      Do the stuff in brackets 8 times.
          v             Push the temporary variable to the stack.
           D            Duplicate the top item of the stack.
            1+          Add one to it (this gives us 1, 2, 3, 4...)
              v         Capture the top item of the stack as a temporary variable.
               r        Reverse the stack.
                ?       Go a stack to the right.
                  vX    Clear the temporary variable slot.
i'h')[          ]       If the last character of the input is 'h', do the stuff in brackets
      88*\[    ]        Do the stuff in brackets 64 times.
           Z            Output everything in the stack as a character.
            ?           Rotate right a stack.
             aO         Output a newline.
i'r')[?1m]              If the penultimate character of the input is 'r', rotate over a 
                        stack, then execute the first index of lines of code.
1m                      Execute the first index of lines of code.

Spiegazione della seconda riga:

84*\[Z??aO]
84*\[     ]   Do the stuff in brackets 32 times.
     Z        Output everything in the stack as a char.
      ??      Rotate two stacks over.
        aO    Output a newline.

Ci saranno nuove linee bonus in coda per "dark" e "entrambi". Richiede che vengano immessi solo "scuro", "entrambi" o "chiaro".

Provalo online!


3

PowerShell v3 +, 142 129 byte

param($a)$d=$a[0]-in('d','b');$l=$a[0]-in('l','b')
97..104|%{$i=[char]$_;1..8|%{if((($q=($_+$i)%2)-eq$l)-or($q+1-eq$d)){"$i$_"}}}

Accetta input $a e imposta due variabili per se dobbiamo generare $darchi o $lquadrati ight in base alla prima lettera dell'input.

Poi, abbiamo un ciclo su a-he 1-8ed utilizza lo stesso trucco, come sul determinare il colore di un quadrato di scacchi per analizzare se si tratta di una variabile aiutante piazza chiaro o scuro (impostazione$q nella prima prova) e aggiungere quella piazza alla pipeline, se del caso. Dopo l'esecuzione, gli elementi sulla pipeline vengono emessi uno per riga.

Richiede v3 o più recente per l' -inoperatore.

Modifica: salvato 13 byte eliminando switche modificando l'ordine di verifica dell'uguaglianza


3

Jolf, 48 byte

Ζ-ώ~1tΜ fΜZAQ8ΨΖ+ζ|<%ζγwώt8ώ6d|<i'd!x%H2>i'ldbHγ

È tutto greco per me ¯ \ _ (ツ) _ / ¯ Questa è una sintesi dell'eccellente risposta di edc65.

Ζ-ώ~1t
Ζ        set ζ to 
  ώ~1     100 * 2
 -   t    minus 10 (=190)

ΜZAQ8ΨΖ+ζ|<%ζγwώt8+2t
 ZAQ8                 A zero array of length Q8 (8*8 = 64)
Μ    Ψ                map that
      Ζ+ζ             ζ += 
           %ζγwώt       ζ % (γ = 19)
          <      8      < 8
         |        ώ6  || 12

Μ f■above thing■d|<i'd!x%H2>i'ldbHγ
 _f■above thing■d                    filter the above thing
                 |<i'd!x%H2>i'l      removing all the bad stuff (i<'d'|v%2^i>'l')
Μ                              dbHγ  map each character to base 19

3

Perl, 69 + 3 = 72 byte

$b=/b/;$i=/l/;$_="@{[grep{$i=!$i||$b}map{$l=$_;map{$l.$_}1..8}a..h]}"

Per essere eseguito con perl -p, per il quale ho aggiunto 3 byte.

Versione meno giocata (leggermente diversa, poiché l'operatore della babycart rende difficile la formattazione corretta):

$b=/b/;                       # flag for input containing b
$i=/l/;                       # start $i as true if input contains 'l'

@a = grep {
    $i = !$i||$b                # alternate unless $b is true
} map {
    $l = $_;                    # save letter
    map {
        $l.$_                   # join letter and number
    } 1..8                      # generate number sequence
} a..h;                         # generate letter sequence

# golfed version uses babycart operator around array expr to save one byte
$_ = "@a"                       # write array, separated

La versione golfizzata utilizza "@{[]}"; la versione commentata utilizza in @a=...; "@"modo che il codice commentato sia ancora eseguibile.


map$l.$_,1..8-1
Choroba,

e lo stesso trucco per grep: grep$i=!$i||$b,mapancora -1
Choroba,

3

C ++, 132 byte

Accetta input dalla riga di comando. Utilizza il voodoo pointer / modulo per le condizioni di stampa.

#include<stdio.h>
int main(int i,char**v){for(int n=0;n<64;n++)if((n+(i=n/8))%2-*v[1]%3){putchar(i+97);putchar(n%8+49);putchar(32);}}

Non penso che il n-loop sia necessario. Penso che sia nidificato per i loop ie jtaglierei alcuni byte. L' (i+j)%2approccio è davvero intelligente. Non ci avevo pensato.
WKS,

Ho notato che (i//8+i%8)%2è lo stesso (i//8+i)%2per cui puoi vincere alcuni byte se rimuovi la definizione dij=n%8
Erwan,

3

Java, 143

class H{public static void main(String[]a){for(char
c=96;++c<'i';)for(int
i=0;++i<9;)if((i+c)%2!=a[0].charAt(0)%3)System.out.println(c+""+i);}}

Ehi, non è la risposta più lunga :)

L'input viene considerato come argomento della riga di comando.


3

PHP, 99 82 79 76 74 73 byte

Utilizza la codifica ISO 8859-1.

for($z=$argv[1];++$x<72;)$x%9&&$z<c|$z>k^$x&1&&print~ß.chr($x/9+97).$x%9;

Esegui in questo modo ( -daggiunto solo per l'estetica):

php -d error_reporting=30709 -r 'for($z=$argv[1];++$x<72;)$x%9&&$z<c|$z>k^$x&1&&print~ß.chr($x/9+97).$x%9; echo"\n";' dark

Funziona così: la variabile $xviene incrementata da 1 a 71, i numeri corrispondono alle celle come mostrato di seguito.

r\c 1  2  3  4  5  6  7  8  [invalid column]
A   1  2  3  4  5  6  7  8  9
B  10 11 12 13 14 15 16 17 18
C  19 20 21 22 23 24 25 26 27
D  28 29 30 31 32 33 34 35 36
E  37 38 39 40 41 42 43 44 45
F  46 47 48 49 50 51 52 53 54
G  55 56 57 58 59 60 61 62 63
H  64 65 66 67 68 69 70 71 72

Pertanto, $x modulo 9restituisce il numero di colonna e $x / 9restituisce il numero di riga, che converto in una lettera utilizzando chr. Il codice $z<c|$z>k^$x&1produce trueper input both( $z<c) e nel caso di lighto darksolo per le celle pari o dispari rispettivamente ( $z>k ^ $x&1). Il risultato di questa espressione determina se le coordinate della cella verranno stampate o meno. Alla fine, se $x modulo 9risulta 0, salto quella cella inesistente.

  • Salvato 18 17 byte (risolto un bug) avendo solo 1 loop, convertendo il numero in un carattere anziché viceversa
  • Salvato 3 byte combinando la condizione per buio e luce con a xor
  • Salvato 3 byte confrontando con l'input completo invece del primo carattere
  • Salvato 2 byte perché non è più necessario sottrarre .125l'espressione$x/9+69.9 per ottenere il numero di riga corretto prima di convertirlo in un carattere
  • Hai salvato un byte usando per dare uno spazio

2

JavaScript ES6, 187 160 159 byte

Probabilmente mi manca qualcosa di dolorosamente ovvio. Oh bene. Non dover appiattire l'array aiuta.

l=s=>(E=[2,4,6,8],O=[1,3,5,7],h=(z=s[0]=="d")?O:E,d=z?E:O,[...h.map(t=>[..."aceg"].map(e=>e+t)),...(d.map(t=>[..."bdfh"].map(e=>e+t))),...(s[0]=="b"?l`d`:[])])

Restituisce un array 2D.


Provalo qui:


2

Ruby, 85

Penso che ci siano modi più brevi su questo, ma questo è un uso carino di .upto.

gets;'a1'.upto('h8'){|e|puts e if e[/[1-8]/]&&(~/b/||((e.ord%2!=e[1].ord%2)^! ~/l/))}

2

R, 129 94 byte

Sapevo di poter generare meglio la scheda :). In sostanza, questo crea una scheda invertita, filtrando i riferimenti di griglia in cui la tonalità non corrisponde all'input. L'output è separato dallo spazio.

a=which(array(c('light','dark'),c(9,9))[-9,-9]!=scan(,''),T);cat(paste0(letters[a[,1]],a[,2]))

Ungolfed

a=which(                           # Get the indexes of
  array(c('light','dark'),c(9,9))  # an array of light dark
    [-9,-9]                        # except for the ninth row and column
      !=scan(,'')                  # where the value doesn't equal the input
    ,T                             # return array index not vector
  );
cat(paste0(letters[a[,1]],a[,2]))  # using letters for col

Test

> a=which(array(c('light','dark'),c(9,9))[-9,-9]!=scan(,''),T);cat(paste0(letters[a[,1]],a[,2]))
1: dark
2: 
Read 1 item
a1 c1 e1 g1 b2 d2 f2 h2 a3 c3 e3 g3 b4 d4 f4 h4 a5 c5 e5 g5 b6 d6 f6 h6 a7 c7 e7 g7 b8 d8 f8 h8
> a=which(array(c('light','dark'),c(9,9))[-9,-9]!=scan(,''),T);cat(paste0(letters[a[,1]],a[,2]))
1: light
2: 
Read 1 item
b1 d1 f1 h1 a2 c2 e2 g2 b3 d3 f3 h3 a4 c4 e4 g4 b5 d5 f5 h5 a6 c6 e6 g6 b7 d7 f7 h7 a8 c8 e8 g8
> a=which(array(c('light','dark'),c(9,9))[-9,-9]!=scan(,''),T);cat(paste0(letters[a[,1]],a[,2]))
1: both
2: 
Read 1 item
a1 b1 c1 d1 e1 f1 g1 h1 a2 b2 c2 d2 e2 f2 g2 h2 a3 b3 c3 d3 e3 f3 g3 h3 a4 b4 c4 d4 e4 f4 g4 h4 a5 b5 c5 d5 e5 f5 g5 h5 a6 b6 c6 d6 e6 f6 g6 h6 a7 b7 c7 d7 e7 f7 g7 h7 a8 b8 c8 d8 e8 f8 g8 h8
>

2

Oracle SQL 11.2, 192 180 byte

SELECT CHR(64+x),DECODE(y,0,8,y)FROM(SELECT CEIL(LEVEL/8)x,MOD(LEVEL,8)y FROM DUAL CONNECT BY LEVEL<=64)WHERE(:1='dark'AND MOD(x+y,2)=0)OR(:1='light'AND MOD(x+y,2)=1)OR(:1='both');

Un-golfed

WITH v AS
(
  SELECT CEIL(LEVEL/8)x, DECODE(MOD(LEVEL,8),0,8,MOD(LEVEL,8))y  
  FROM DUAL CONNECT BY LEVEL<=64
)
SELECT CHR(64+x),y
FROM   v
WHERE  (:1='dark' AND MOD(x+y,2)=0)OR(:1='light' AND MOD(x+y,2)=1)OR(:1='both');

La vista v genera le coordinate di ciascun quadrato. Se la somma delle coordinate è pari allora il quadrato è nero, altrimenti è bianco.


2

Ruggine, 263 259 244 Bytes

use std::char;use std::env;fn main(){let n=env::args().nth(1).unwrap();for i in 0..8{for j in 0..8{if n=="both"||(n=="dark"&&(i+j)%2==0)||(n== "light"&&(i+j)%2!=0){println!("{}{}",char::from_u32(i+97).unwrap(),char::from_u32(j+49).unwrap())}}}}

Forma estesa:

fn main() {
    let input = env::args().nth(1).unwrap();
    for i in 0..8{
            for j in 0..8{
                if input == "both"
                || (input == "dark" && (i+j)%2==0)
                || (input == "light" && (i+j)%2!=0){
                    println!("{}{}",char::from_u32(i+97).unwrap(),char::from_u32(j+49).unwrap());
            }
        }
    }
}

1
Invece di codificare in modo rigido il tuo input, non è possibile leggerlo dal terminale o dalla riga di comando o come parametro di funzione?
Neil,


2

CJam, 29

qci3%:X;8Ym*{~+2%X-},"a1 "f.+

Solo una soluzione rapida e sporca: p
Provalo online

Spiegazione:

q           read the input
ci          convert to (first) character then to integer
3%          modulo 3; results for d(ark), l(ight) and b(oth) are 1, 0, 2
:X;         store in X and pop
8Ym*        generate all pairs (Y=2) of numbers from 0 to 7
{…},        filter using the condition block
  ~         dump the current pair on the stack
  +2%       calculate the sum modulo 2
  X-        subtract X; if the result is not 0, the pair is kept
"a1 "f.+    vectorized-add "a1 " to each remaining pair
             this means the character 'a' is added to the first number,
             the character '1' is added to the second number,
             and then the space character is appended
            the contents of the stack are automatically printed at the end

2

Haskell, 133 116 105 100 98 91 byte

f r=[["abcdefgh"!!x,"12345678"!!y]|x<-l,y<-l,odd(x+y)||r<"l",even(x+y)||r!!0/='d']
l=[0..7]

Questo è il mio primo tentativo di giocare a golf con Haskell.

Con l'aiuto di Michael Klein, siamo riusciti a ottenere meno di 100 caratteri!


1
Che ne dici di c>0per c==1e c<1per c==0? Salva due byte.
Michael Klein,

Fantastico, abbiamo ottenuto meno di 100! Grazie Michael.
Joeytwiddle,

1
Prego. Mi sono risucchiato un po 'e l'ho portato a 86 byte rifattorando un po':f r=[[[a,b]|a<-['a'..'h'],b<-['1'..'8']]!!i|i<-[0..63],even i||r<"l",odd i||r!!0/='d']
Michael Klein,

1
È molto carino, un approccio ripensato. Anche se mi dispiace dirlo strano e nemmeno idarci strisce diagonali. Alcuni risolvono questo problema con i+i`div`8(come x+y). Altri iniziano con ['1'..'9']e [0..71]quindi conservano solo i i`mod`9<8risultati in un secondo momento, per 96 byte. Tuttavia, questo ibrido dei nostri due approcci funziona bene a 91 byte:l=[0..7];f r=[["abcdefgh"!!x,"12345678"!!y]|x<-l,y<-l,odd(x+y)||r<"l",even(x+y)||r!!0/='d']
joeytwiddle,

Ah, beh, va ancora meglio
Michael Klein,

1

Mathematica 133 byte

Metodo 1 : 108 byte. Questo costruisce il tabellone come un tavolo, con etichette in ogni cella e restituisce diagonali o bande chiare o scure come richiesto.

Table[Table[{i,j},{i,{h,g,f,e,d,c,b,a}},{j,Range@8}]~Diagonal~k,{k,If[#=="light",-6,-7],7,If[#=="both",1,2]}]&

%["light"]   (*where % repeats the preceding line *)

{{{b, 1}, {a, 2}}, {{d, 1}, {c, 2}, {b, 3}, {a, 4}}, {{f, 1}, {e , 2}, {d, 3}, {c, 4}, {b, 5}, {a, 6}}, {{h, 1}, {g, 2}, {f, 3}, {e , 4}, {d, 5}, {c, 6}, {b, 7}, {a, 8}}, {{h, 3}, {g, 4}, {f, 5}, {e , 6}, {d, 7}, {c, 8}}, {{h, 5}, {g, 6}, {f, 7}, {e, 8}}, {{h, 7}, {g, 8}}}


Metodo 2 : 133 byte. Crea una matrice e seleziona in base alla natura dispari della somma del numero di riga + numero di colonna di ogni cella.

Position[Array[Boole@OddQ[#+#2] &,{8,8}],Switch[#,"dark",0,"light",1,"both",0|1]]/.
{j_,k_}:>{j/.Thread[Range@8->{a,b,c,d,e,f,g,h}],k}&


1

JS, 197 byte

b=[];d=[];l=[];for(i=1;i<9;i++){for(j=1;j<9;j++){a=String.fromCharCode(96+i*1)+j;b.push(a);if((i+j)%2<1){d.push(a)}else{l.push(a)}}}m=[0,"both",b,"dark",d,"light",l];alert(m[m.indexOf(prompt())+1])

1

Python (3.5), 106 100 96 92 byte

usa il trucco di MegaTom (i+j)%2per vincere 6 byte

f=lambda s:[chr(97+i//8)+str(1+i%8)for i in range(64)if s[0]=='b'or(i//8+i)%2==(s[0]=='l')]

Provalo su repl.it

risultati

>>> f('light')
['a2', 'a4', 'a6', 'a8', 'b1', 'b3', 'b5', 'b7', 'c2', 'c4', 'c6', 'c8', 'd1', 'd3', 'd5', 'd7', 'e2', 'e4', 'e6', 'e8', 'f1', 'f3', 'f5', 'f7', 'g2', 'g4', 'g6', 'g8', 'h1', 'h3', 'h5', 'h7']
>>> f('dark')
['a1', 'a3', 'a5', 'a7', 'b2', 'b4', 'b6', 'b8', 'c1', 'c3', 'c5', 'c7', 'd2', 'd4', 'd6', 'd8', 'e1', 'e3', 'e5', 'e7', 'f2', 'f4', 'f6', 'f8', 'g1', 'g3', 'g5', 'g7', 'h2', 'h4', 'h6', 'h8']
>>> f('both')
['a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'g1', 'g2', 'g3', 'g4', 'g5', 'g6', 'g7', 'g8', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8']

Versione precedente

f=lambda s:[i for i in[i+j for i in'abcdefgh'for j in'123456780'][s[0]=='l'::2-(s[0]=='b')]if'0'not in i]

1

C ++, 119 byte

Basato sul trucco di MegaTom.

#include <stdio.h>
int main(int n,char**v){for(n=0;n<64;++n){if((n+n/8)%2-**(v+1)%3){printf("%c%c ",n/8+97,n%8+49);}}}

0

C (gcc) , 112 byte

f(char*s){for(int m=*s^'d'?*s^'l'?3:2:1,l=64,x;l--;m&1&!x|(m&2&&x)&&printf("%c%d ",l%8+97,l/8+1))x=l%8%2^l/8%2;}

Provalo online!

Se a == 1, un quadrato sarà sempre nero se la "stranezza" di riga e colonna è la stessa, ovvero entrambi sono dispari o entrambi sono pari. È vero il contrario per i quadrati bianchi, dove riga e colonna differiranno sempre per la stranezza.

Dopodiché, si tratta solo di combinare i loop di riga e colonna, nonché di consultare una tabella di precedenza dell'operatore fino a raggiungere un livello sufficiente di incomprensibilità.

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.