Keluarkan semua kotak putih atau hitam dari papan catur


29

pengantar

Seperti inilah bentuk papan catur.

masukkan deskripsi gambar di sini

Anda dapat melihat bahwa itu a1adalah kotak gelap . Namun, b1adalah kotak cahaya .

Tugas

Tantangannya adalah, diberikan dark, lightatau both, output semua kotak gelap , terang atau semua dengan pemisah (seperti spasi atau baris baru). Urutan semua kotak tidak masalah .

Uji kasus

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

Catatan: Saya sudah melakukan prettified output tetapi ini tidak perlu .

Ini adalah , jadi pengiriman dengan jumlah byte paling sedikit menang!


Jadi, sesuatu seperti a2a4a6...tidak apa-apa?
Conor O'Brien

@CᴏɴᴏʀO'Bʀɪᴇɴ Itu memang harus mengandung seperator, seperti spasi atau baris baru, sehingga tidak valid.
Adnan

Bisakah kita mengeluarkan matriks 2d mentah? Yaitu[[a2,a4,a6,a8],[...]...]
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Ya, itu diizinkan
Adnan

Apakah light, darkdan bothharus dimasukkan sebagai Strings atau dapatkah mereka direpresentasikan melalui tipe data apa pun?
WKS

Jawaban:


15

Pyth, 22 21 byte

-1 byte oleh @ Sp3000

fn%Chz3%sCMT2sM*<G8S8

Di bawah fungsi %Chz3, darkhash ke 1, lightke 0, dan bothke 2. Jika kita mengambil paritas jumlah ords dari kotak catur (yaitu, a1-> [97, 33]-> (97 + 33)%2= 0, kotak gelap pergi ke 0, dan cahaya ke 1 Ini memungkinkan kita untuk memfilter berdasarkan ketidaksetaraan.

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.

Coba di sini .


21:fn%Chz3%sCMT2sM*<G8S8
Sp3000

@ Sp3000 Terima kasih! Mengetahui saya menggunakan 6 byte untuk membuatnya pas, saya harus mencoba hash yang berbeda.
lirtosiast

13

Bash + GNU Utilities, 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}adalah ekspansi bash brace yang menghasilkan semua koordinat untuk papan 8x8, ditambah kolom tambahan 9. Ini penting karena membuat panjang baris aneh yang memungkinkan efek papan tulis.

The printfhanya format setiap koordinat, satu per baris.

Ekspresi sed yang dibangun kemudian menghapus semua x9koordinat dan kemudian mencetak garis genap atau ganjil atau keduanya, sesuai dengan input skrip.


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]+''

Mengembalikan string kotak yang dipisahkan koma. Versi yang kompatibel untuk 99 byte:

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

Bekerja dengan menghitung semua 64 nama kuadrat, kemudian menguraikannya dalam basis 19 untuk melihat apakah mereka adalah modulo 2 terang atau gelap.


Baik. Ini ES7
edc65

@ edc65 Ah, saya tidak ingat. Saya menganggapnya versi kedua saya "hanya" ES6.
Neil

Sekarang ES6 mengalahkan ES7
edc65

@ edc65 Anda bilang?
Neil

4
@ edc65 Saya kira kita tidak bisa menyetujui pengundian?
Neil

10

JavaScript (ES6), 82 87 98

Fungsi anonim mengembalikan string kotak yang dipisahkan ruang.

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

UJI

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 ... itu gila! Saya ingin tahu apakah mungkin untuk mendapatkan yang lebih pendek dengan ES6 ...
ETHproduksi

@ EHProduk ya itu! Saya sudah siap 86, tapi saya masih mencoba untuk melakukan sesuatu yang lebih baik (target saya - bergerak - adalah Neil dengan 85 ... tidak peduli 83)
edc65

7

Batch, 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

Coba di sini!

Masih lebih lama dari solusi Pyth lainnya, tapi saya rasa saya tidak bisa mengalahkan ini dengan algoritma saya.

Penjelasan

Pertama kita membuat daftar semua kotak di papan tulis dan menugaskannya Y. Kemudian kami memfilter daftar ini sehingga hanya kotak cahaya yang tersisa dan menetapkan daftar ini J. Setelah itu kami mengevaluasi input dan mencetak:

  • Y jika input both
  • J jika input light
  • Y-J jika inputnya adalah dark

Menentukan apakah bujur sangkar berfungsi sebagai berikut:

  • Petakan char ke angka dari 1-8 (a-> 1, b-> 2), hasil 18untuk a8, dll.
  • periksa apakah kedua angka itu ganjil atau genap ( x%2 == y%2)
  • Jika ya, persegi itu terang, kalau tidak gelap

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

Ya ampun itu lebih pendek dari milikku dengan tembakan panjang.
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]

Saya masih agak bingung apakah fungsi oke untuk pertanyaan itu, karena tantangannya menyebutkan "pemisah", tetapi karena ada banyak pengajuan fungsi lainnya, saya telah melakukan hal yang sama.

Mirip dengan jawaban Erwan ini tetapi dengan banyak sedikit lebih Python 2-ness.

(-2 byte terima kasih kepada @xnor)


lol Saya bahkan tidak menguji antara s=="dark"dan s[0]=="d"tetapi untuk pertahanan saya dalam percobaan pertama saya, saya menggunakan s,*_=sdan 4cmp
Erwan

1
Saya merasa harus ada sesuatu yang lebih pendek seperti ord(s[_])&_atau ord(s[_])/_.
xnor

@ xnor Memang, ada dengan %:) Terima kasih!
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 ";

Itu loop melalui cols (0-7) dan baris (1-8) dan memeriksa apakah jumlah keduanya ganjil / genap.

Diuji dengan PHP 5.6.4, jalankan: php -d error_reporting=30709 -r '<CODE>' {dark|light|both}


1
Selamat datang di PPCG! Ini adalah jawaban yang bagus, tetapi Anda akan mendapatkan lebih banyak suara jika Anda menambahkan penjelasan.
lirtosiast

Saya pikir Anda bisa menggantinya $s==2dengan $s-1. Jika $ s = 2, dan -1, ini 1, yang benar dan akan berlanjut
Martijn

Dan saya pikir $c=0bisa $c, itu akan memberikan banyak pemberitahuan, tetapi setidaknya untuk gelap berfungsi dengan baik
Martijn

Terima kasih, Martijn! Saya lupa menghapus kawat gigi juga, -6 byte untuk saat ini. Dan saya tidak tahu mengapa, tetapi $s-1tidak berhasil, tetapi seharusnya begitu. Terima kasih atas ide bagus ini! Saya akan men-debug itu nanti.
killerbees19

Saya baru ke situs ini, tetapi pesan kesalahan karena $cvariabel tidak ditentukan ? Kedengarannya agak aneh dan tidak valid. Atau tidak?
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]

Penjelasan dari baris pertama:

'`'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.

Penjelasan dari baris kedua:

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.

Akan ada bonus mengikuti baris baru untuk 'gelap' dan 'keduanya'. Mengharuskan hanya 'gelap', 'keduanya', atau 'terang' yang akan dimasukkan.

Cobalah 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$_"}}}

Mengambil input $adan menetapkan dua variabel untuk jika kita akan output $dark atau $lkotak ight berdasarkan huruf pertama dari input.

Kemudian, kita loop lebih a-hdan 1-8dan menggunakan trik yang sama seperti pada Tentukan warna persegi catur untuk mengurai apakah itu sebuah variabel pembantu terang atau gelap persegi (pengaturan$q dalam tes pertama) dan menambahkan persegi yang ke pipa jika sesuai. Setelah eksekusi, elemen-elemen pada pipeline adalah output satu per baris.

Membutuhkan v3 atau yang lebih baru untuk -in operator.

Sunting - Disimpan 13 byte dengan menghilangkan switchdan dengan mengubah urutan pengujian kesetaraan


3

Jolf, 48 byte

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

Bagi saya semuanya adalah bahasa Yunani ¯ \ _ (ツ) _ / ¯ Ini adalah pengubahan dari jawaban luar biasa 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]}"

Untuk dijalankan perl -p, saya menambahkan 3 byte.

Versi kurang golf (sedikit berbeda, karena operator babycart menyulitkan untuk memformat dengan baik):

$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

Versi golf menggunakan "@{[]}"; versi komentar menggunakan @a=...; "@"sehingga kode komentar masih dapat dijalankan.


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

dan trik yang sama untuk grep: grep$i=!$i||$b,maplagi -1
choroba

3

C ++, 132 byte

Mengambil input dengan baris perintah. Menggunakan pointer / modulo voodoo untuk kondisi cetak.

#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);}}

Saya tidak berpikir n-loop itu perlu. Saya pikir bersarang untuk loop untuk idan jakan memangkas beberapa byte. The (i+j)%2pendekatan adalah benar-benar pintar. Saya tidak memikirkan itu.
WKS

Saya hanya melihat itu (i//8+i%8)%2sama (i//8+i)%2sehingga Anda dapat memenangkan beberapa byte jika Anda menghapus definisij=n%8
Erwan

3

Jawa, 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);}}

Hei, itu bukan jawaban terpanjang :)

Input diambil sebagai argumen baris perintah.


3

PHP, 99 82 82 79 76 74 73 byte

Menggunakan penyandian ISO 8859-1.

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

Jalankan seperti ini (-d ditambahkan hanya untuk estetika):

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

Ia bekerja seperti ini: variabel $x bertambah dari 1 menjadi 71, angka-angka sesuai dengan sel-sel seperti yang ditunjukkan di bawah ini.

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

Oleh karena itu, $x modulo 9hasilkan nomor kolom dan $x / 9hasilkan nomor baris, yang saya konversi menjadi huruf menggunakan chr. Kode $z<c|$z>k^$x&1menghasilkan trueinput both( $z<c) dan dalam kasus masing-masing lightatau darkhanya untuk sel genap atau ganjil ( $z>k ^ $x&1). Hasil dari ekspresi ini menentukan apakah koordinat sel kemudian akan dicetak. Akhirnya, jika $x modulo 9hasilnya 0, saya melewatkan sel yang tidak ada itu.

  • Disimpan 18 17 byte (memperbaiki bug) dengan hanya memiliki 1 loop, mengubah nomor menjadi char, bukan sebaliknya
  • Disimpan 3 byte dengan menggabungkan kondisi gelap dan terang dengan a xor
  • Disimpan 3 byte dengan membandingkan terhadap input penuh, bukan char pertama
  • Disimpan 2 byte karena tidak perlu lagi mengurangi .125ekspresi$x/9+69.9 untuk mendapatkan nomor baris yang benar sebelum mengkonversi ke char
  • Menyimpan byte dengan menggunakan untuk menghasilkan spasi

2

JavaScript ES6, 187 160 159 byte

Saya mungkin kehilangan sesuatu yang jelas sangat menyakitkan. Baiklah. Tidak harus meratakan array membantu.

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`:[])])

Mengembalikan array 2D.


Coba di sini:


2

Ruby, 85

Saya pikir ada cara yang lebih pendek tentang ini, tetapi ini adalah penggunaan yang lucu .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

Saya tahu saya bisa menghasilkan papan yang lebih baik :). Pada dasarnya ini membangun papan terbalik, memfilter referensi grid di mana warna tidak cocok dengan input. Output dipisahkan oleh ruang.

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

Tidak disatukan

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

Uji

> 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');

Tidak bermain golf

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');

Tampilan v menghasilkan koordinat setiap kotak. Jika jumlah koordinatnya genap maka kuadratnya hitam, kalau tidak putih.


2

Rust, 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())}}}}

Formulir yang Diperluas:

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
Daripada mengkodekan input Anda, apakah tidak mungkin untuk membacanya dari terminal atau baris perintah atau sebagai parameter fungsi?
Neil

2

MATL , 31 byte

1)t3\8:t!++w4\~?H\]2#f2Y2!w)wVh

Cobalah online!


Yang ini sepertinya tidak memberikan kotak yang benar. "dark" memberikan x1, x3, x5, x7 untuk setiap huruf x, tapi itu sesuai dengan 4 kolom, bukan kotak hitam.
Esteemator

@Esteemator Maaf, kesalahan saya. Diperbaiki
Luis Mendo

2

CJam, 29

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

Hanya solusi cepat dan kotor: p
Cobalah online

Penjelasan:

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]

Ini adalah usaha pertama saya di golf Haskell.

Dengan bantuan Michael Klein, kami berhasil mendapatkannya di bawah 100 karakter!


1
Bagaimana c>0untuk c==1dan c<1untuk c==0? Menghemat dua byte.
Michael Klein

Fantastis, kami mendapatkannya di bawah 100! Terima kasih Michael.
joeytwiddle

1
Sama-sama. Saya mendapat sedikit mengisap dan turun ke 86 byte dengan refactoring sedikit: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
Itu sangat bagus, pendekatan yang dipikirkan kembali. Meski aku minta maaf mengatakan itu aneh dan genapi tidak memberi kita garis-garis diagonal. Beberapa menyelesaikan ini dengan i+i`div`8(seperti x+y). Yang lain mulai dengan ['1'..'9']dan [0..71]kemudian mempertahankan hanya i`mod`9<8hasilnya nanti, untuk 96 byte. Namun, hibrida dari dua pendekatan kami ini berjalan dengan baik pada 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, well, itu masih sedikit lebih baik
Michael Klein

1

Mathematica 133 byte

Metode 1 : 108 byte. Ini membangun papan sebagai tabel, dengan label di setiap sel, dan mengembalikan diagonal atau pita terang atau gelap sesuai kebutuhan.

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}}}


Metode 2 : 133 byte. Membuat array dan memilih sesuai dengan sifat genap jumlah nomor baris + jumlah kolom setiap sel.

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

gunakan trik MegaTom (i+j)%2 untuk memenangkan 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')]

Cobalah di repl.it

Hasil

>>> 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']

Versi sebelumnya

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 Bytes

Berdasarkan trik 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;}

Cobalah online!

Jika a == 1, maka sebuah persegi akan selalu hitam jika "keanehan" dari baris dan kolom sama, yaitu keduanya ganjil atau keduanya genap. Yang sebaliknya berlaku untuk kotak putih, di mana baris dan kolom akan selalu berbeda dalam keanehan.

Setelah itu, itu hanya masalah menggabungkan baris dan kolom loop, serta berkonsultasi dengan tabel diutamakan operator sampai tingkat yang cukup dimengerti telah tercapai.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.