Surat Mandi Busa

19

Jika Anda memiliki anak kecil di rumah Anda, Anda mungkin menemukan surat mandi busa. Ini dapat dibasahi dan menempel pada permukaan datar seperti ubin dan sisi bak mandi untuk membuat kata-kata dan pesan.

Kisaran kata-kata dan pesan agak terbatas jika Anda hanya memiliki satu set meskipun, karena Anda hanya mendapatkan 36 karakter: huruf besar AZ, dan angka 0-9: ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789. Namun, Anda bisa licik dan menyalahgunakan beberapa huruf dan angka untuk membentuk salinan tambahan dari surat lain:

3: E
1: I
7: L (when rotated)
M: W (when rotated)
0: O
2: S (when flipped)
5: S
W: M (when rotated)
2: Z
5: Z (when flipped)
O: 0
6: 9 (when rotated)
L: 7 (when rotated)
9: 6 (when rotated)

Perhatikan bahwa ini tidak semuanya dua arah, karena cenderung lebih mudah untuk membaca digit sebagai bagian dari kata daripada huruf sebagai bagian dari angka.

Setiap set juga tersedia dalam berbagai warna, di mana setiap huruf diwarnai secara berurutan. Misalnya, jika set Anda memiliki 3 warna, Merah, Kuning dan Biru, set Anda akan seperti:

  • Merah: ADGJMPSVY147
  • Kuning: BEHKNQTWZ258
  • Biru: CFILORUX0369

Tugas Anda, oleh karena itu, adalah mengambil tiga parameter (dengan cara apa pun yang sesuai) yang menunjukkan kata atau frasa, jumlah warna yang akan digunakan, dan jumlah set yang Anda miliki, kemudian untuk menghasilkan representasi kata atau frasa, dalam satu set warna yang cocok, gunakan pengganti jika diperlukan. Jika tidak memungkinkan untuk membuat kata atau frasa yang diberikan jumlah set, sebaliknya output "Tidak", dalam warna yang sesuai.

Contohnya

Dalam semua ini, parameter pertama adalah kata atau frasa, yang kedua adalah jumlah warna, dan yang ketiga adalah jumlah set yang tersedia.

["bath", 3, 1]

MANDI

["programming", 3, 2]

PEMROGRAMAN

["puzzles", 3, 1]

PUZ2LES

["code golf", 5, 1]

KODE G0LF

["willow tree", 1, 1]

WIL7OM TRE3

["impossible phrase", 8, 1]

NGGAK - hanya ada 1 P dalam satu set, dan tidak ada pengganti yang valid

Catatan

  • Anda dapat menetapkan secara default ke 1 set jika ini membantu (misalnya nilai parameter default 1), tetapi Anda harus mendukung beberapa set jika diminta. Jumlah set yang Anda miliki akan selalu menjadi bilangan bulat non-nol positif.
  • Jika Anda memiliki beberapa set, semuanya berwarna dengan cara yang sama: jika A berwarna merah di set pertama, itu juga akan menjadi merah di set kedua juga. Warna-warna diterapkan per set, tidak untuk semua set dalam doa yang diberikan
  • Anda harus mendukung 1 hingga 36 warna - 1 berarti semua karakter memiliki warna yang sama, 36 berarti semuanya berbeda. Hanya akan ada jumlah warna integer.
  • Anda dapat menggunakan warna apa saja, selama mereka berbeda secara visual - jika Anda keluaran ke terminal, Anda dapat menggunakan kombinasi foreground dan background sebagai "color", meskipun Anda tidak harus menggunakan warna yang sama untuk foreground dan background
  • Output Anda harus menggunakan karakter yang sebenarnya Anda gunakan, bukan karakter dari input. Misalnya, jika Anda memiliki input ["willow", 1, 1], Anda dapat menghasilkan WIL7OMdengan 7 dan M diputar 180 derajat
  • Anda harus menggunakan huruf yang benar terlebih dahulu, kemudian ganti: MI7LOWtidak benar untuk ["willow", 1, 1]
  • Anda dapat menggunakan subtitusi apa saja untuk karakter yang diberikan: SO5dan SO2dengan membalik 2 keduanya berlaku untuk "SOS"
  • Banyak pemanggilan kode Anda untuk input yang sama tidak harus menghasilkan output yang identik
  • Output harus dalam huruf besar, tetapi input bisa dalam campuran huruf besar dan kecil
  • Itu harus jelas, tetapi ruang tidak memiliki warna

Aturan

  • Ini adalah kode golf, tetapi dengan output semi-grafis (saya tidak yakin apakah Anda dapat melakukan membalik teks di terminal, tetapi saya tertarik untuk melihat apakah Pyth memiliki built-in untuk itu)
  • Celah standar berlaku
  • Tidak ada bonus untuk fungsi, tetapi silakan pilih jawaban yang menarik
  • Sertakan beberapa tangkapan layar dari hasil Anda dalam jawaban Anda

Tantangan Terkait

Matius
sumber
1
Bagaimana jika itu tidak mungkin untuk menghasilkan "NOPE" mengingat set?
Rɪᴋᴇʀ
@Riker Satu set berisi 36 karakter yang diberikan. Kapan tidak mungkin untuk menghasilkan NOPE?
mypetlion
@mypetlion ketika tidak ada set ...
Rɪᴋᴇʀ
@Riker Read "Jumlah set yang Anda miliki akan selalu menjadi bilangan bulat non-nol positif."
mypetlion
1
Surat mandi busa adalah pengantar yang bagus untuk berbicara leet ...
Arnauld

Jawaban:

1

HTML / JavaScript (dengan jQuery) / CSS - non-bersaing / non-golf

Hanya untuk menggulirkan bola, dan menunjukkan bahwa itu tidak mustahil, berikut ini adalah implementasi non-golf, non-bersaing yang mengambil pendekatan naif terhadap tugas tersebut.

Pertama-tama menciptakan string dari semua karakter yang mungkin ( tempalph), dengan menggabungkan salinan alfabet sebanyak ada set. Kemudian iterates melalui frase, menempatkan setiap huruf dari frase ke dalam variabel output, dan mengosongkan contoh pertama dari surat itu dari tempalph. Jika tidak bisa (surat itu tidak ada), ia memeriksa apakah surat itu dapat diganti dengan sesuatu yang tersisa di string. Jika itu juga gagal, itu akan menghasilkan output "NOPE" yang telah ditentukan sebelumnya. Dengan asumsi itu tidak mengenai case "NOPE", ia mengembalikan string output dan memasukkannya ke dalam DIV pada halaman.

Kemudian loop melalui string alfabet dasar, dan jika huruf telah digunakan, berikan kelas CSS yang sesuai, masing-masing memiliki seperangkat warna yang telah ditentukan.

Ini menggunakan input HTML untuk input, dan pembaruan pada keyup di dalamnya.

Cobalah di JSFiddle

Contoh untuk ["BATH", 3, 1]:

Mandi

JS:

var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

function getPhrase (frase, set) {
    var modphrase = "";
  var nope = 'NOPE';
  var re = / ^ [A-Z0-9] + $ /;
  if (re.test (phrase)) {
    // mungkin valid - perlu memeriksa ada cukup karakter yang tersedia
    // Pada titik ini, perlu melihat secara spesifik karakter apa yang dibutuhkan

    var tempalph = "";
    untuk (var i = 0; i '+ char +' ';
        if (tempalph.indexOf (char)! = -1) {
        tempalph = tempalph.replace (char, "#");
      } lain {
        switch (char) {
            huruf "E":
            if (tempalph.indexOf ("3")! = -1) {
                    tempalph = tempalph.replace ("3", "#");
              modchar = '3';
                } lain {
                kembali nggak;
            }
            istirahat;
          huruf "I":
            if (tempalph.indexOf ("1")! = -1) {
                    tempalph = tempalph.replace ("1", "#");
              modchar = '1';
                } lain {
              kembali nggak;
            }
            istirahat;
          huruf "L":
            if (tempalph.indexOf ("7")! = -1) {
                    tempalph = tempalph.replace ("7", "#");
              modchar = '7';
                } lain {
              kembali nggak;
            }
            istirahat;
          huruf "M":
            if (tempalph.indexOf ("W")! = -1) {
                    tempalph = tempalph.replace ("W", "#");
              modchar = 'W';
                } lain {
              kembali nggak;
            }
            istirahat;
          huruf "O":
            if (tempalph.indexOf ("0")! = -1) {
                    tempalph = tempalph.replace ("0", "#");
              modchar = '0';
                } lain {
              kembali nggak;
            }
            istirahat;
          huruf "W":
            if (tempalph.indexOf ("M")! = -1) {
                    tempalph = tempalph.replace ("M", "#");
              modchar = 'M';
                } lain {
              kembali nggak;
            }
            istirahat;
          huruf "0":
            if (tempalph.indexOf ("O")! = -1) {
                    tempalph = tempalph.replace ("O", "#");
              modchar = 'O';
                } lain {
              kembali nggak;
            }
            istirahat;
          huruf "6":
            if (tempalph.indexOf ("9")! = -1) {
                    tempalph = tempalph.replace ("9", "#");
              modchar = '9';
                } lain {
              kembali nggak;
            }
            istirahat;
          huruf "7":
            if (tempalph.indexOf ("L")! = -1) {
                    tempalph = tempalph.replace ("L", "#");
              modchar = 'L';
                } lain {
              kembali nggak;
            }
            istirahat;
          huruf "9":
            if (tempalph.indexOf ("6")! = -1) {
                    tempalph = tempalph.replace ("6", "#");
              modchar = '6';
                } lain {
              kembali nggak;
            }
            istirahat;

          huruf "S":
            if (tempalph.indexOf ("5")! = -1) {
                    tempalph = tempalph.replace ("5", "#");
              modchar = '5';
                } lain jika (tempalph.indexOf ("2")! = -1) {
                    tempalph = tempalph.replace ("2", "#");
              modchar = '2';
                } lain {
              kembali nggak;
            }
            istirahat;
                    huruf "Z":
            if (tempalph.indexOf ("2")! = -1) {
                    tempalph = tempalph.replace ("2", "#");
              modchar = '2';
                } lain jika (tempalph.indexOf ("5")! = -1) {
                    tempalph = tempalph.replace ("5", "#");
              modchar = '5';
                } lain {
              kembali nggak;
            }
            istirahat;
          kasus " ":
            istirahat;
          default:
            kembali nggak;
          }

      }
        modphrase + = modchar;
    }

    mengembalikan modphrase;
  } lain {
    // mengandung beberapa karakter lain, jadi jelas tidak valid
    kembali nggak;
  }
}

function addColors (colcount) {
  var i = 0;
  untuk (biarkan karakter alfabet) {
    exclass = "." + char;
    newclass = "col" + i;
    if ($ (exclass) .length> 0) {
      $ (exclass) .addClass (newclass);
    }
    i ++;
    if (i == colcount) {
        i = 0;
    } 
  }
}


$ ("# phrase, # sets, # colors"). on ("keyup", function () {
    var phrase = $ ("# phrase"). val (). toUpperCase ();
  phrase = getPhrase (phrase, $ ("# sets"). val ());
    $ ("# output"). html (frasa);
  addColors ($ ("# colors"). val ());
})

HTML:

<label> Frase <input type = "text" id = "phrase" /> </label>
<label> Warna <input type = "text" id = "colors" value = "3" /> </label>
<label> Set <input type = "text" id = "sets" value = "1" /> </label>

<div id = "output">

</div>

CSS:

.col0 {color: # f00}
.col1 {color: # 0f0}
.col2 {color: # 00f}
.col3 {color: # 66CDAA}
.col4 {color: # EE82EE}
.col5 {color: # 7FFFD4}
.col6 {color: # 7FFFD4}
.col7 {color: #FFDEAD}
.col8 {color: # D8BFD8}
.col9 {color: # FF6347}
.col10 {color: # 8B4513}
.col11 {color: # 800000}
.col12 {color: # 00FFFF}
.col13 {color: # 32CD32}
.col14 {color: # 191970}
.col15 {color: # 1E90FF}
.col16 {color: # A0522D}
.col17 {color: # 808000}
.col18 {color: # DC143C}
.col19 {color: # 90EE90}
.col20 {color: # D2691E}
.col21 {color: # 48D1CC}
.col22 {color: # 008000}
.col23 {color: # 8B008B}
.col24 {color: # 6495ED}
.col25 {color: # 800080}
.col26 {color: # 000080}
.col27 {color: # DB7093}
.col28 {color: # 7FFF00}
.col29 {color: # 00FA9A}
.col30 {color: # 0000FF}
.col31 {color: # BC8F8F}
.col32 {color: # A52A2A}
.col33 {color: # 4169E1}
.col34 {color: # FFFF00}
.col35 {color: # FFA07A}

.rot {display: inline-block; transform: rotate (0.5turn);}
.flip {display: inline-block; transform: rotateY (0.5turn);}

div {
  font-family: sans-serif;
  ukuran font: 3em;
  warna latar: # 000;
  padding: 10px;
}
Matius
sumber
Saya pikir pesaing non serius harus dimasukkan dalam pertanyaan, per ini (mini) meta konsensus.
user202729