Meskipun dilempar Thoreau, Troll menerobos palung yang sulit


19

Untuk masing-masing dari sembilan kata yang mirip membingungkan ini , tetapkan angka 1-9 dengan cara apa pun yang Anda suka:

though
through
thorough
Thoreau
throw
threw
trough
tough
troll

Tulis program yang menggunakan string. Jika input adalah salah satu dari sembilan kata ini, masukkan angka yang Anda tentukan. Jika input bukan salah satu dari kata-kata di atas, program dapat melakukan apa saja (termasuk kesalahan atau loop selamanya).

Kata-katanya peka huruf besar-kecil, misalnya Thoreau, harus menghasilkan angka dari 1-9 tetapi thoreautidak harus melakukan hal yang sama.

Contoh

Misalkan Anda menetapkan angka sebagai berikut:

though   9
through  2
thorough 7
Thoreau  6
throw    3
threw    5
trough   4
tough    1
troll    8

Lalu kapan toughinput, 1harus output.
Kapan throughinput, 2harus output.
Kapan throwinput, 3harus output.
. . .
Kapan thoughinput, 9harus output.

Semua input lain dapat melakukan apa saja.

Detail

  • Ambil string input melalui stdin atau baris perintah dan output ke stdout.
  • Output mungkin berisi satu baris baru.
  • Alih-alih program, Anda dapat menulis fungsi yang mengambil string dan mencetak hasilnya secara normal atau mengembalikannya.
  • Pengajuan terpendek dalam byte menang .

1
Sial! Saya punya solusi cerdas untuk menghasilkan nol ketika tidak ditemukan dengan menggunakan findmetode string Python . Kemudian aturannya berubah. Gagasan pintar tidak begitu pintar sekarang.
Logic Knight

@CarpetPython Saya benar-benar buruk. Jangan ragu untuk mengundurkan diri jika Anda merasa tidak puas dengan perubahan itu. (Meskipun saya berjanji kepada semua orang tidak akan ada perubahan lagi.)
Calvin's Hobbies

Tidak apa-apa. Saya pikir jawaban saya masih valid (meskipun saya sedikit bertele-tele).
Logic Knight

Bisakah saya membuatnya berfungsi terlepas dari kapitalisasi?
ASCIIThenANSI

2
@ASCIIThenANSI selama ia bekerja untuk 9 kasus
Calvin's Hobbies

Jawaban:


19

CJam, 11 9 7 byte

q1b2+B%

Bagaimana itu bekerja :

Kami memanfaatkan fakta bahwa jumlah kode ASCII + 2 yang dimodifikasi dengan 11 memberikan urutan 1 hingga 9 yang sangat bagus dan kemudian 10 untuk sembilan kata yang bersangkutan. Berikut pemesanannya:

through -> 1
thorough -> 2 
tough -> 3 
Thoreau -> 4 
throw -> 5 
threw -> 6 
trough -> 7 
though -> 8 
troll -> 9

Penjelasan kode :

q               e# Read the input
 1b             e# Sum the ASCII code values of all characters in this word
   2+           e# Increment the sum by 2
     B%         e# Mod by 11 and automatically print the mod result at the end

4 byte disimpan berkat user23013

Cobalah online di sini


Bagaimana kita mencobanya? (tidak semua orang berbicara CJam, sebagian dari kita berbicara lolcode)
Behrooz

@Behrooz Ada sebuah tautan. Klik di atasnya, masukkan input Anda di bagian input, Jalankan. Tidak yakin bagaimana caranya bisa lebih mudah :)
Pengoptimal

Holly sial, aku berpikir bagaimana aku harus memberikannya daftar kata-kata. nice one
Behrooz

1
@ user23013 Sial! Setiap saat!
Pengoptimal

2
Atau q1b2+B%.
jimmy23013

18

Pyth, 8 karakter

e%Cz8109

Cobalah online: Demonstrasi atau Test Suite

Saya menggunakan tugas:

though   5
through  9
thorough 4
Thoreau  7
throw    3
threw    2
trough   8
tough    6
troll    1

Penjelasan:

   z       input()
  C        convert to int (convert each char to their ASCII value
           and interprete the result as number in base 256)
 %  8109   modulo 8109
e          modulo 10

Btw, saya menemukan angka ajaib 8109 dengan menggunakan script ini: fqr1 10Sme%CdT.z1.


Apakah ini tidak memiliki false positive?
alexander-brett

5
@ alexander-brett Apa sebenarnya yang Anda maksud? Output dari semua input lain tidak ditentukan dalam OP. Kami dapat menampilkan apa pun yang kami inginkan.
Jakube

Maaf, saya melewatkan suntingan itu ke OP. Sayang sekali: P
alexander-brett

11

Python 2, 92 54 byte

print'K{7j)yE<}'.find(chr(hash(raw_input())%95+32))+1

String indeks dibuat dengan for word in words: print chr(hash(word)%95+32), . Seperti yang ditunjukkan dalam jawaban Jakube, fungsi hash akan memberikan hasil yang berbeda tergantung pada versi Python. String indeks ini dihitung pada 64 bit Python 2.7.6.

Lebih panjang (92 byte) tetapi kurang samar jawabannya:

print'though through thorough Thoreau throw threw trough tough troll'.find(raw_input())/7+1

Program mengembalikan 1-9 meskipun melalui lemparan Thoreau menyeluruh melalui troll tangguh dalam urutan itu. Ketika input tidak ditemukan, find akan mengembalikan -1 yang dengan mudah berubah menjadi nol setelah +1.


Perhatikan bahwa 0barang tidak lagi diperlukan. Maaf karena mengubahnya pada Anda.
Hobi Calvin

Terima kasih telah memperhatikan upaya ini. Itu solusi yang bagus untuk sementara waktu ...
Logic Knight

3
@CarpetPython Penggunaan lantai yang bagus - hasilnya sangat bagus.
xnor

7

Python 2.7.9 versi 32 bit, 22 byte

lambda x:hash(x)%78%10

Perhatikan, versinya sangat penting di sini. Anda akan mendapatkan hasil yang berbeda jika Anda menggunakan Python versi 64 bit. Karena hashmetode ini akan menghitung nilai hash 64 bit, bukan 32 bit.

Tugasnya adalah:

though  => 5   through => 6   thorough => 8
Thoreau => 7   throw   => 3   threw    => 1
trough  => 9   tough   => 4   troll    => 2

Cobalah online: http://ideone.com/Rqp9J8


2
Wow, jadi selama ini, Anda melakukan iterasi melalui versi bahasa dan bit sistem operasi? : P
Optimizer

1
Jawaban yang sangat bagus Apakah Anda menemukan konstanta melalui matematika, iterasi otomatis, atau tebakan?
Logic Knight

3
@CarpetPython Hanya loop kasar yang melewati semua modul yang mungkin. Suatu kali sorted(...)==range(1,10), saya berhenti.
Jakube

5

Pyth, 7 byte

et%Cz31

Saya menggunakan tugas berikut:

though   8
through  3
thorough 1
Thoreau  5
throw    4
threw    7
trough   6
tough    2
troll    9

Czmenginterpretasikan input sebagai nomor 256 basis. Kemudian, kita ambil mod 31 ini, kurangi 1, dan ambil hasilnya mod 10. Kodesemu yang sepadan:

((base_256(input()) % 31) - 1) % 10

Demonstrasi , uji harness .


1

Python 2, 27 byte

f=lambda w:int(w,34)%444/46

Dengan tugas ini:

>>> for w in "though through thorough Thoreau throw threw trough tough troll".split(): print f(w),w
...
9 though
7 through
3 thorough
8 Thoreau
2 throw
5 threw
6 trough
1 tough
4 troll

Beberapa variasi dimungkinkan, misalnya

f=lambda w:int(w,35)/159%10

1

Japt , 6 byte

nH %BÉ

Cobalah | Periksa semua kata


Penjelasan

Mengambil keuntungan dari fakta bahwa, ketika mengurai nstring dasar ke integer, JavaScript akan berhenti mengurai jika bertemu dengan digit yang lebih besar dari ndan mengembalikan hasilnya ke titik itu. Dengan menggunakan basis-32 di sini (digit 0-v) huruf ws pada "throw" dan "throw" pada dasarnya diabaikan.

nH      :Convert from base-32
   %B   :Modulo 11
     É  :Subtract 1

JavaScript, 22 byte

Terjemahan langsung - tampaknya tidak layak untuk diposkan secara terpisah.

f=
U=>parseInt(U,32)%11-1
o.innerText=["through","tough","troll","trough","though","throw","threw","thorough","Thoreau"].map(s=>f(s)+": "+s).join`\n`
<pre id=o><pre>



0

Java 8, 53 25 byte

s->(s.chars().sum()+2)%11

atau

s->-~-~s.chars().sum()%11

Pelabuhan @Optimizer 's CJam jawaban, karena (kemungkinan besar) tidak dapat dilakukan setiap pendek di Jawa ..

Cobalah online.


Java punya parseInt, bukan? Apakah port solusi saya tidak lebih pendek?
Shaggy

@Shaggy Java memang memiliki parseIntbasis yang diberikan, tapi sayangnya itu cukup byte karena persyaratan kelas statis: Long.parseLong(...,32)sebagai varian terpendek Selain itu, tampaknya gagal untuk "throw"(dan "threw"juga) di Jawa karena beberapa alasan . wtampaknya di luar kisaran base-32 (dan menggunakan 33 memberikan hasil yang salah).
Kevin Cruijssen

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.