Konversi 1, 2, 3, 4, 5, 6, 7, 8, dan 9 menjadi “satu”, “dua”, “tiga”, dll

47

Pemenang: jawaban pesta professorfish ! Seluruh 9 byte! Wow!

Anda dapat terus mengirimkan jawaban Anda, namun Anda tidak bisa lagi menang. Pos asli disimpan untuk anak cucu:


Tujuan Anda adalah mengonversi seluruh angka antara 1-9 menjadi kata yang diwakilinya.

  • Anda tidak perlu khawatir tentang desimal
  • Pengguna akan memasukkan nomor. Asumsikan bahwa mereka tidak akan pernah memasukkan apa pun 10 atau lebih tinggi
  • Pengguna harus mengetikkan angka di beberapa titik, namun metode yang dibaca program itu tidak masalah. Bisa dengan stdin, membaca file teks, dll, namun pengguna harus menekan tombol 9 pada keyboard mereka (misalnya) di beberapa titik
  • Ini tidak peka huruf besar-kecil (yaitu, "satu", "Satu", "oNe", "OnE", dll. Semuanya dapat diterima)
  • Permintaan HTTP / etc diizinkan, namun kode apa pun yang dijalankan oleh server permintaan dibuat untuk diperhitungkan terhadap jumlah byte dari kode akhir Anda (misalnya jika saya memiliki program C ++ membuat permintaan HTTP, kode PHP yang digunakan dalam jumlah permintaan HTTP )
  • Apa pun yang dapat dikompilasi dan dijalankan dapat diterima

  • Kontes ini telah berakhir pada 27 Juni 2014 (7 hari sejak posting).
  • Ini adalah , sehingga kode terpendek menang
Jon
sumber
2
Apakah trailing whitespace (ie one ) dapat diterima?
grc
1
@ grc Ya, selama program mengeluarkan kata.
Jon
1
Anda harus menentukan bahwa hanya nomor yang diberikan yang dapat dicetak dan bukan nomor lainnya.
Pinna_be
1
@Pinna_be misalnya, jika saya masukan 3, Anda tidak dapat menampilkan one two three four five six seven eight ninemeskipun secara teknis Anda keluaran three. Demikian pula, Anda tidak dapat menampilkan three seven, dll.
Jon
1
Pertanyaan ini cukup bagus. Tapi saya tidak suka menambahkan batas tanggal. Terutama, batas tanggal telah ditambahkan tepat sebelum batas tanggal, bukan 7 hari sebelumnya.
Nicolas Barbulesco

Jawaban:

19

Bash (dengan bsdgames), 9

number -l

Membaca dari input standar.

Saya tidak tahu mengapa ada utilitas untuk ini, tetapi apa pun itu.


sumber
2
Saya tidak yakin saya suka menginstal bsdgames dan kemudian menyebutnya "bash", meskipun saya akan mengakui bahwa reservasi saya subjektif.
Paul Draper
@PaulDraper Saya juga tidak. Saya tidak memposting ini sebagai jawaban yang serius, saya pikir salah satu dari jawaban lain yang layak diterima
5
Bukankah ini celah standar?
Justin
2
@ Quincunx ya, itu pada dasarnya. Meskipun kebanyakan hal adalah utilitas eksternal di Bash, saya tidak akan menganggap paket bsdgames sebagai sesuatu yang sangat diizinkan (tidak seperti grep, wget, coreutils, sed, bc ...).
132

Python 2, 64

print' ottffssennwhoiieiieoruvxvgn  ere ehe  e   nt'[input()::9]

Seperti inilah bentuk string dengan spasi putih tambahan (coba baca secara vertikal):

o t t f f s s e n
n w h o i i e i i
e o r u v x v g n
    e r e   e h e 
    e       n t

Seperti yang dijelaskan dalam komentar di bawah, [input()::9]dimulai pada indeks yang diberikan dan memilih setiap karakter berikutnya kesembilan.

grc
sumber
9
Oh, sial, aku suka ini. Mungkin layak menunjukkan bahwa ini adalah python 2, omong-omong.
undergroundmonorail
3
Tolong jelaskan! :)
Christofer Ohlsson
6
@ChristoferOlsson input()::9adalah rentang dari input()hingga akhir string dalam langkah-langkah 9, seperti 1,10,19,28,37atau 3,12,21,30,39, yang persis indeks di mana huruf-huruf untuk kata yang sesuai ditemukan.
Martin Ender
1
@ m.buettner terima kasih! Itu bagus.
Christofer Ohlsson
6
Bukankah ini seperti apa yang dilakukan cipher rail-pagar? (+1 untuk solusi yang rapi.)
Lou
18

Common Lisp - 22 byte

Inilah yang umum (bukan hanya untuk satu-sepuluh):

(format nil"~R"(read))

Oh, Anda ingin ordinals (pertama, kedua, ... tiga per seratus ...)? Baik!

(format nil"~:R"(read))
filcab
sumber
10
Bukankah ini celah standar?
seequ
2
Loophole dalam arti apa? Ini didefinisikan dengan jelas di Hyperspec: lispworks.com/documentation/lw50/CLHS/Body/22_cba.htm
filcab
10
Seperti dalam hal ini: meta.codegolf.stackexchange.com/a/1078/20356
seequ
3
Entah itu celah standar atau tidak, itu yang saya datang ke sini juga untuk dikirim. +1 :)
Joshua Taylor
5
@TheRare Melihat komentar pada jawaban itu, saya tidak berpikir ada konsensus komunitas yang kuat bahwa ini adalah celah. Perasaan saya adalah bahwa pertanyaan harus secara eksplisit melarang penggunaan fungsi bawaan semacam ini jika tidak digunakan.
Digital Trauma
16

BASH 51

Jadi saya membuat yang lain menggunakan ide kedua saya ditambah bantuan dari yang lain:

set one two three four five six seven eight nine

$X

Di mana 'X' adalah nomor yang Anda inginkan.


BASH 48 (67)

67 dengan \njeda baris

Saya tidak yakin apakah ini benar-benar diperhitungkan, karena membaca dari file, tetapi:

sed -n Xp a

Di mana "X" adalah input dan di mana afile dengan:

one
two
three
four
five
six
seven
eight
nine

File adalah 36 karakter, dan perintah bash adalah 13.

Bagaimana itu bekerja:

Setiap baris dalam file diberi nomor, dimulai dengan 1. Jadi 'satu' ada di baris 1, 'dua' di baris ke-2. Perintah, sed -n 'Xp' amengatakan, "Silakan cetak apa yang terdaftar di baris 'X' file 'a'" sedadalah editor aliran Unix. -nberarti diam, atau hanya pada dasarnya mengabaikan yang lainnya. Xpberarti mencetak apa yang ada di baris 'X'.

Eric Lagergren
sumber
2
Jawaban pertama yang bagus! Terima kasih telah meluangkan waktu untuk mencari tahu bagaimana kami memformat jawaban kami di situs ini. Selamat Datang di Programming Puzzles dan Code Golf!
Justin
2
Anda tidak menghitung umpan baris di a.
Dennis
1
Satu byte kurang dari sebelumnya, menerima argumen baris perintah dan tidak memerlukan file tambahan: pastebin.com/qdbXKQGP Bash akan mengeluh tentang pembatas heredoc yang hilang, tetapi itu akan berjalan baik dengan Dash dan Zsh.
Dennis
1
@ Dennis oh keren saya suka itu. Apakah saya seharusnya mengedit jawaban saya dengan Anda sekarang? Maaf, saya baru mengenal kode golf.
Eric Lagergren
1
Anda dapat menghilangkan 'tanda kutip. Anda juga dapat mencoba menggunakan string di sini alih-alih file eksternal. Tetapi Anda benar-benar harus menghitung jeda baris dalam file Anda.
Trauma Digital
16

C # - 127 (86/46)

Jika Anda hanya mengambil bagian yang dapat dieksekusi ...

Console.Write(((HourOfDay)Console.Read()-48));

dan jika HourOfDayakan menjadi bagian dari namespace Sistem Anda akan membutuhkan 46 karakter. Sayangnya itu duduk di System.DirectoryServices.ActiveDirectorymana membuatnya 86 ... kebisingan lainnya merusaknya.

Ini dapat dikompilasi dan dijalankan dari commandline (127 karakter):

using System;class P{static void Main(){Console.Write((System.DirectoryServices.ActiveDirectory.HourOfDay)Console.Read()-48);}}

jika disimpan ke file bernama cg2.cs

csc cg2.cs /r:System.DirectoryServices.dll  && cg2

Bagaimana cara kerjanya?

HourOfDay adalah tipe enum sehingga kita dapat menggunakan nama alih-alih konstanta ajaib. Jenis Enum memiliki implementasi ToString () yang memberi Anda nama nilai . Anda bisa memberikan int ke enum. Console.Read () membaca karakter dari aliran input yang direpresentasikan sebagai integer. mengetik '1' memberikan 49 , kurangi 48 untuk mendapatkan 1, cor / kotak HourOfDayuntuk mengembalikan 'One'.

Lihatlah versi Powershell dari trik yang sama ini

rene
sumber
Bagaimana cara kerjanya? Katakanlah saya masuk 9. Apa yang dilakukan program itu?
Nicolas Barbulesco
Apa yang -48dilakukan di sini?
Nicolas Barbulesco
2
@NicolasBarbulesco menambahkan sebuah Bagaimana cara kerjanya? ayat. Apakah masuk akal?
rene
1
@NicolasBarbulesco - Diurutkan secara alfabet. Yang masuk akal dalam setiap konteks kecuali "Kata-kata ini adalah angka". Karena saya yakin dokumentasinya dibuat secara otomatis, tidak masuk akal jika ada satu artikel khusus.
Bobson
13

Befunge 98, 116 105 103 byte

&1-       v
vvvvvvvvvj<
"""""""""
etnxereoe
nheivuewn
igvsiorto
nie"ffh""
"es ""t
 ""   "
>>>>>>>>>4k,@

Befunge tidak dibuat untuk ini ...

Penjelasan:

&1-           ;Grab the input number (`n`) and subtract 1 from it
&1-       v   ;Start moving downwards
          <   ;Start moving leftwards
         j    ;Jump `n - 1` characters to the left.
vvvvvvvvvj    ;Redirect each of the possible locations to jump to, sending the IP down.

        "     ;If `n` was 1, push `o, n, e` onto the stack (`o` is at the bottom)
        e
        n
        o
        "

       "      ;If `n` was 2, push `t, w, o` onto the stack
       o
       w
       t
       "

    *
    *
    *

"             ;If `n` was 9, push `n, i, n, e` onto the stack
e
n
i
n
"

>>>>>>>>>     ;Collect all the different possible positions the IP could be in, and send it right
>>>>>>>>>4k,  ;Print the top 5 chars. If there are less than 5, the rest are null characters. This is allowed
            @ ;End of program
Justin
sumber
8
@ Dennis Saya tidak bisa melihat bagaimana itu bisa sangat sulit. Hanya mengambil file, mengubahnya menjadi char[][], menjaga xdan ylokasi, dan melaksanakan karakter di lokasi itu. Hal yang paling sulit adalah mendefinisikan operasi untuk setiap karakter yang mungkin.
Justin
1
Anda dapat dengan mudah menyimpan dua byte dengan a &1-.
har-wradim
10

Javascript 68

Atob / btoa dapat menjadi alat kompresi orang miskin (tetapi jika Anda ingin mencoba ini di konsol, Anda tidak dapat menyalin dari teks yang diformat yang Anda lihat sekaligus. Buka 'edit' dan salin dari panel sumber)

Editor penurunan harga tidak menyukai beberapa karakter dalam jawaban ini: beberapa karakter hilang karena tabungan. Tetap saja, saya pikir ini masalah editor, bukan masalah saya. Karakter yang hilang adalah karakter unicode 8 bit yang valid.
(Atau saya salah, jika masalah ini sudah diperdebatkan dalam meta, beri tahu saya) Ini adalah versi dengan karakter yang menyinggung lolos, setiap urutan \ xNN harus dihitung 1

alert(btoa("×C§{Dð£Dá­ç´\x16\x8b«ÐX¯{D¢ÇD\x9e½éô\x12(!·Cb\x9dí").split(0)[prompt()])

Tes sederhana

Di konsol firefox:

[0,1,2,3,4,5,6,7,8,9]
.map(x=>x +',' btoa("×C§{Dð£Dá­ç´\x16\x8b«ÐX¯{D¢ÇD\x9e½éô\x12(!·Cb\x9dí").split(0)[x])
edc65
sumber
Saya mencoba sesuatu yang serupa tetapi tidak dapat menemukan string base64 yang valid dimulai dengan angka. Saya pikir jawaban Anda telah rusak oleh stackexchange.
nderscore
@nderscore, sialan hakmu. Mengubah posting, masih valid menurut saya
edc65
1
Dengan versi yang memiliki karakter yang lolos, semuanya berfungsi kecuali 3 dan 8, output Treedan EightF.
Justin
3
@Quincunx 'Tree' adalah saya tidak bisa berbahasa Inggris
edc65
10

Javascript 73

alert('0one0two0three0four0five0six0seven0eight0nine'.split(0)[prompt()])

69

alert(btoa("ôéÞõ5õ1ëxO_¢êý|Þöȱõ'xß^hSôا{Ý").split(9)[prompt()])
nderscore
sumber
Secara teknis tidak akan alert('0one0two0three0four0five0six0seven0eight0nine'.split(0)[#])menjadi hal yang sama tetapi menghemat 8 byte? Pengguna masih memasukkan nomor yang mereka inginkan ...
Eric Lagergren
@ eric_lagergren maksud Anda pengguna harus mengubah nomor di sumber? Saya tidak berpikir itu akan dihitung sebagai input.
nderscore
Oh, oke, aku mengerti maksudmu. Saya kira jika Anda menjalankannya seperti perintah di konsol itu akan menjadi bagian dari input yang bertentangan dengan sumbernya.
Eric Lagergren
7

Perl, 55

$_=(nine,eight,seven,six,five,four,three,two,one)[-$_]

Dijalankan dengan opsi -p(+1 byte), misalnya:

perl -pe '$_=(nine,eight,seven,six,five,four,three,two,one)[-$_]'

Input diharapkan dalam STDIN dan output ditulis ke STDOUT.

Kode hanya menghasilkan sebuah array dan memilih elemen yang tepat. Opsi -pmengurus membaca jalur input ke $_dan mencetak hasilnya $_.

Variasi:

  • Dengan mengikuti baris baru (+3):

    $_=(nine,eight,seven,six,five,four,three,two,one)[-$_].$/

    atau (jumlah byte yang sama):

    s/./(nine,eight,seven,six,five,four,three,two,one)[-$&]/e

Memperbarui:

  • Menggunakan kata-kata telanjang alih-alih qw[...](terima kasih Zaid).

  • Indeks negatif menyimpan satu byte (terima kasih aragaer).

Heiko Oberdiek
sumber
1
Simpan beberapa karakter:$_=(one,two,three,four,five,six,seven,eight,nine)[$_-1]
Zaid
2
@Zaid: Terima kasih, ini menghemat dua byte. (Saya terbiasa use strict).
Heiko Oberdiek
Saya tidak suka itu "-1". $_=(nine,eight,seven,six,five,four,three,two,one)[-$_]- satu karakter lebih pendek.
aragaer
@aragaer: Terima kasih, ide bagus.
Heiko Oberdiek
6

Oracle SQL - 46

select to_char(to_date(&1,'j'),'jsp')from dual

Demonstrasi

Ini memang termasuk celah standar , saya akui, tetapi SQL lebih pendek dari Golfscript; Saya tidak bisa menolak!

Ini bekerja dengan (ab) menggunakan model format datetime Oracle . TO_DATE(n, 'j')mengkonversi angka menjadi hari Julian , jumlah hari sejak 1 Januari 4712 SM. TO_CHAR(<date>, 'jsp')mengubahnya kembali menjadi integer (meskipun sebagai string). The sp, adalah akhiran elemen format yang mengeja angka. Ini sebenarnya akan bekerja dengan angka yang cukup banyak.

Ini &1adalah variabel substitusi yang hanya akan bekerja dengan klien yang menerimanya, misalnya SQL * Plus.

Ben
sumber
Saya memiliki hubungan cinta / benci dengan RDBMS Oracle tetapi ini bagus.
rene
6

CJam, 45 43 byte

"^AM-^L8M-xM-^L^US^_M-^WrM-rM- 1M-s^CHM-|M-X^HE,M-qM-^EM-q4"256bKb'ef+'j/li=

Di atas menggunakan ^ dan notasi-M, karena beberapa karakter tidak dapat dicetak.

Dengan biaya 9 byte lebih, karakter yang tidak patut dapat dihindari:

" one two three four five six seven eight nine"S/li=

Cobalah online.

Bagaimana itu bekerja

" Convert the string into an integer by considering it a base-256 number.                ";

"^AM-^L8M-xM-^L^US^_M-^WrM-rM- 1M-s^CHM-|M-X^HE,M-qM-^EM-q4"256b

" Convert the integer from above into an array by considering it a base-20 number.       ";

Kb

" Add the ASCII character code of “e” to all elements of that array. This casts to char. ";

'ef+

" So far, we've pushed the string “jonejtwojthreejfourjfivejsixjsevenjeightjnine”.       ";

" Split the the above string where the character “j” occurs.                             ";

'j/

" Read an integer from STDIN and push the corresponding substring.                       ";

li=

Contoh

$ base64 -d > convert.cjam <<< IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YktiJ2VmKydqL2xpPQ==
$ wc -c convert.cjam
43 convert.cjam
LANG=en_US cjam convert.cjam <<< 5
five
Dennis
sumber
Wow, jawaban kami identik, bahkan panjangnya (saya anggap pengguna memasukkan string).
Justin
1
@ Quincunx: Pikiran yang sama berpikir hebat! : P Tapi membaca input pengguna akan dikenakan biaya dua byte di CJam, jadi saya harus memikirkan hal lain ...
Dennis
@ Quincunx: Ini harus bekerja dengan GolfScript juga, meskipun mungkin tidak akan menghemat byte. Basis Base64:IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YmFzZSAyMGJhc2V7MTAxK30lIiIr
Dennis
Inilah yang berhasil saya buat; lebih panjang: golfscript.apphb.com/…
Justin
Apakah Anda tahu apa yang diharapkan dari skrip golf encoding untuk karakter non-ascii? Tampaknya tidak utf-8
Justin
5

GolfScript, 51 byte

~'
one
two
three
four
five
six
seven
eight
nine'n/=

Ini adalah tabel pencarian sederhana. Input dievaluasi ( ~), array nilai-nilai dibuat, dan indeks ditemukan.

Coba di sini

Justin
sumber
Pengguna harus memasukkan string, Anda tidak dapat membuatnya dengan kode keras. Juga, Try it heretautan Anda memiliki kode yang berbeda dari kode yang ditempelkan.
Jon
@Chipperyman Pengguna memasukkan string dalam program ini. Perbedaan Try it heretautan dalam kode adalah karena halaman web tidak mendukung input pengguna. Ubah string setelah ;, ini identik dengan input pengguna.
Justin
Ah, begitu. Saya tidak tahu naskah golf dengan baik, terima kasih telah memberi tahu saya.
Jon
2
@Chipperyman: GolfScript menempatkan konten STDIN di tumpukan sebelum menjalankan skrip itu sendiri.
Dennis
2
Hah! Saya bisa mengalahkan Anda dengan satu byte ! ;-)
Ilmari Karonen
4

Perl, 60 byte

$_=(ZOneTwoThreeFourFiveSixSevenEightNine=~/.[a-z]*/g)[$_]

Membutuhkan -psakelar (dua byte).

Contoh

$ perl -p convert.pl <<< 5
Five

Bagaimana itu bekerja

  • -pmembaca dari STDIN dan menyimpan hasilnya di $_.

  • =~/.[a-z]*/g membagi kata pengantar sebelumnya menjadi substring dari satu huruf (huruf besar) diikuti oleh sejumlah huruf kecil.

  • (…) mengumpulkan substring ke dalam array.

  • [$_] mengambil substring yang sesuai dengan input pengguna.

  • $_=…menyimpan hasilnya $_.

  • -pmencetak nilai $_.

Dennis
sumber
2
Saya suka trik regex. +1
seequ
3

Batch DOS - 162 Karakter (termasuk jeda baris)

Jawaban ini terinspirasi oleh jawaban Python @ grc, meskipun saya memiliki sesuatu yang serupa dalam pikiran.

@setlocal enabledelayedexpansion
@set s="ottffssennwhoiieiieoruvxvgn  ere ehe  e   nt
@set /a c=%1
@set z=!s:~%c%,1!
@if _%z%==_ exit /b
@echo %z%
@%0 %c%+9

Pemakaian:

[Nama file] [angka]

Misalnya, jika kode tersebut dalam file bernama speak.bat, dan Anda ingin melihat nomor "lima", Anda akan menjalankannya sebagai:

speak 5

Juga, outputnya dari atas ke bawah, bukan dari kiri ke kanan! Jadi, bukannya

lima

kamu akan lihat

f
i
v
e

Ruslan
sumber
3

Bash + coreutils, 64

Konsep kompresi non-kompetitif

xxd -p<<<TàPnàõ:àsÀ~®@ãCN|tr 0-9a-d \\ng-inor-x|sed -n $1p

Beberapa karakter eksotis di sini mungkin tidak dapat ditampilkan dengan baik, jadi skrip ini dapat direkonstruksi dari representasi base64:

base64 -d <<< eHhkIC1wPDw8VOCLUIJu4PWWDzrgc8B+rkDjEoBDTnx0ciAwLTlhLWQgXFxuZy1pbm9yLXh8c2VkIC1uICQxcA==

Contoh output

$ ./n.sh 1
one
$ ./n.sh 9
nine
$ 

Penjelasan

Terpikir oleh saya bahwa string one two three four five six seven eight ninehanya berisi huruf efghinorstuvwxdan pemisah ruang - total nilai 15 karakter. Dengan demikian setiap karakter berpotensi direpresentasikan dalam 4 bit, atau 2 karakter per 1 byte. Kita dapat menggunakan representasi hex dari byte sebagai cara mudah untuk membagi setiap byte menjadi dua digit hex. Kami kemudian dapat mengubah digit hex kembali ke huruf yang kami butuhkan menggunakan tratau serupa. Seperti nasib itu, rstuvwxyang berturut-turut, sehingga dapat dinyatakan sebagai r-xuntuk tr. Encoding yang diatur sedemikian rupa sehingga edan fyang tersisa sebagai-adalah, dan bahwa kata-kata yang line-break dipisahkan, sehingga kita dapat menggunakan seduntuk ouptut hanya garis yang kita butuhkan.

Proses pendekodean ini berakhir dengan menggunakan cukup banyak ruang ekstra, jadi jadikan jawaban ini tidak kompetitif sebagai jawaban gaya-skrip shell, tetapi mungkin konsep yang berguna dalam bahasa lain.

Trauma Digital
sumber
3

(murni) Bash, 64

Mengambil input sebagai argumen pertama, dengan asumsi input yang valid.

v=(o one two three four five six seven eight nine)
echo ${v[$1]}

Membuat array v, lalu mengakses elemen yang ditentukan pada input. Karena array tidak diindeks, saya harus menambahkan elemen 0 sebagai pengganti. Atau (thnx @DennisWilliamson untuk menunjukkan ini):

v=(one two three four five six seven eight nine)
echo ${v[$1-1]}

sumber
2
Hitungan karakter yang sama: v=(one two three four five six seven eight nine)danecho ${v[$1-1]}
Dennis Williamson
3

Python 2.x - 65 64

Tidak sebagus jawaban @grc, tapi tentu lebih terbaca :-)

'one two three four five six seven eight nine'.split()[input()-1]

Satu char kurang, terima kasih kepada @flornquake

'nine eight seven six five four three two one'.split()[-input()]
Willem
sumber
Yang ini juga bagus. :-) Berhasil.
Nicolas Barbulesco
3
Anda dapat menyimpan satu karakter seperti ini:'nine eight seven six five four three two one'.split()[-input()]
flornquake
Itu bagus sekali!
Willem
3

Java 7 - 185

class Num{
public static void main(String[] args) {
    System.out.print("ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE".split(",")[(new java.util.Scanner(System.in)).nextInt()-1]);
    }}
Bayi
sumber
3

C 111

#include <stdio.h>
int main(){printf("%.5s","one  two  threefour five six  seveneightnine"+5*(getchar()-'1'));}

Panjang di sini adalah hati-hati direkayasa sehingga saya bisa menafsirkannya sebagai biner dan mengkonversi yang untuk desimal. Hanya dengan 7 karakter, saya yakin saya memiliki pemenang!

Jerry Coffin
sumber
1
+1 Pegolf kode umumnya tidak keberatan jika kode c Anda mengkompilasi dengan peringatan , asalkan memenuhi spesifikasi. Jadi, Anda dapat menghilangkan jenis #includedan main()kembali. Juga menggigit refactoring ekspresi Anda: main(){printf("%.5s","one two threefour five six seveneightnine"+5*getchar()-245);}. 86 karakter menurut perhitungan saya.
Trauma Digital
Saya tidak mendapatkan barang panjang, dan saya tidak melihat di mana akan ada 7 karakter.
Nicolas Barbulesco
@NicolasBarbulesco: Ini 111 karakter - tetapi jika kita memperlakukan 111sebagai biner, itu akan dikonversi menjadi 7dalam desimal.
Jerry Coffin
Jerry, ada kode golf yang berjalan di kepalamu!
Nicolas Barbulesco
3

bash say (OS X): 3 8

"Tujuanmu adalah untuk mengubah angka keseluruhan antara 1-9 menjadi kata yang diwakilinya"

Terakhir kali saya memeriksa, kata-kata yang diucapkan adalah kata-kata juga. Upaya sebelumnya (tidak menerima input)

say 4

Edit, harus dapat membaca input:

say|read

Ketikkan nomor apa saja dan kata keluar. Saya tahu tanggal akhirnya akan tiba, tetapi menurut saya saya seharusnya memenangkan kontes.

Contoh file audio: four.aiff

SepupuCocaine
sumber
seharusnya tidak 5?
rpax
@ rpax Saya tidak percaya input dihitung sebagai karakter, bukan?
CousinCocaine
1
Ini pintar. Tapi ini melewatkan input.
Nicolas Barbulesco
1
Sayangnya ini bukan jawaban yang valid karena: Ia tidak pernah menerima input dari pengguna DAN itu hanya berfungsi jika angkanya 4.
Jon
1
Komentar Chipperyman tentang jawaban CousinCocaine ini benar. Tapi itu benar untuk jawaban oleh @RegisteredUser juga. Namun, Chipperyman telah menolak jawaban ini oleh CousinCocaine, dan telah menyatakan jawabannya oleh pemenang Pengguna Terdaftar ex æquo. Selain itu, jawaban oleh Pengguna Terdaftar adalah replika dari jawaban ini oleh CousinCocaine. Ini lebih dari tidak adil.
Nicolas Barbulesco
2

VBScript 98 80 75

msgbox split(" one two three four five six seven eight nine")(inputbox(""))
nyaman
sumber
2

J - 68 atau 60 57 atau 53 byte

Versi interaktif (stdin):

>one`two`three`four`five`six`seven`eight`nine{~<:".1!:1]1

Versi fungsi:

f=:one`two`three`four`five`six`seven`eight`nine>@{~<:

Penjelasan:

f=:one`two`three`four`five`six`seven`eight`nine>@{~<:
                                                   <: Decrease by one
                                                 {~   Get the correct string
                                               >@     Unbox

".(1!:1)1 membaca sebuah string dan mengubahnya menjadi integer

seequ
sumber
Anda dapat menyimpan satu char dengan menuliskannya sebagai kereta ( (;:'one two blah')>@{~<:) dan enam lainnya dengan menggunakan gerund one`two`blahbukan ;:.
algorithmshark
@algorithmshark Terima kasih! Saya masih belajar J. Meskipun, bukankah versi kereta memerlukan teks untuk menjadi peringkat tak terbatas (edit: ternyata tidak ... mengapa tidak?) Dan kutipan tambahan versi gerund (edit: oh, itu membuat daftar kotak)?
seequ
Garpu dapat memiliki kata benda dalam argumen kiri, yang merupakan singkatan untuk kata kerja konstan yang menghasilkan kata benda dengan peringkat tak terbatas (qv the Dictionary ). Dan tidak, tidak ada kutipan tambahan pada gerund: nama-nama yang tidak didefinisikan diperlakukan sebagai referensi untuk kata kerja, dan gerund untuk itu hanyalah string kotak yang berisi nama.
algorithmshark
Juga, Anda tidak harus menulis versi STDIN sebagai ekspresi kata kerja: >one`two`three`four`five`six`seven`eight`nine{~<:".1!:1]1lebih pendek 3 karakter.
algorithmshark
1
@algorithmshark Haha, mengapa saya tidak melakukannya dengan cara itu?
seequ
2

Perl 36 (58 standalone)

use Number::Spell;say spell_number<>

Atau, tanpa modul tambahan:

say qw(one two three four five six seven eight nine)[<>-1]
el.pescado
sumber
Skrip pertama Anda tidak berfungsi, di Mac saya. Can't locate Number/Spell.pm in @INC (@INC contains: /Library/Perl/5.16/darwin-thread-multi-2level /Library/Perl/5.16 /Network/Library/Perl/5.16/darwin-thread-multi-2level /Network/Library/Perl/5.16 /Library/Perl/Updates/5.16.2 /System/Library/Perl/5.16/darwin-thread-multi-2level /System/Library/Perl/5.16 /System/Library/Perl/Extras/5.16/darwin-thread-multi-2level /System/Library/Perl/Extras/5.16 .) at toto.pl line 1. BEGIN failed--compilation aborted at toto.pl line 1.
Nicolas Barbulesco
Skrip kedua Anda tidak berfungsi, di Mac saya. syntax error at titi.pl line 1, near "say qw(one two three four five six seven eight nine)" Execution of titi.pl aborted due to compilation errors.
Nicolas Barbulesco
2

Di AppleScript; 123 karakter.

{"one","two","three","four","five","six","seven","eight","nine"}'s item((display dialog""default answer"")'s text returned)

Script ini mengambil input dalam dialog. Kemudian memberikan output dalam AppleScript ini  hasil .

Contoh:

  • Memasukkan : 6
  • Keluaran: "six"

Ini adalah versi yang lebih bagus:

set l to {"one","two","three","four","five","six","seven","eight","nine"}
set n to text returned of (display dialog "?" default answer "")
display dialog (l's item n) buttons ("OK") default button 1

Versi ini menampilkan output dalam dialog yang bagus.

Contoh:

  • Memasukkan : 9
  • Keluaran: nine

[Jawaban diedit; sedikit meningkatkan dialog untuk input; masih 124 karakter. Jawaban diedit lagi; sekarang 1 char kurang! ]

Nicolas Barbulesco
sumber
1
set n to text returned of... Wow.
seequ
2

Powershell - 91 74

[Enum]::ToObject([System.DirectoryServices.ActiveDirectory.HourOfDay],[Console]::Read()-48)

Menemukan cara melakukan cast untuk menghapus panggilan Enum dan ToObject:

[System.DirectoryServices.ActiveDirectory.HourOfDay]([Console]::Read()-48)

Bagaimana cara kerjanya?

HourOfDay adalah tipe enum sehingga kita dapat menggunakan nama alih-alih konstanta ajaib. Jenis Enum memiliki implementasi ToString () yang memberi Anda nama nilai konstan. Anda bisa memberikan int ke enum. Console.Read () membaca karakter dari aliran input yang direpresentasikan sebagai integer. mengetik '1' menghasilkan 49, kurangi 48 untuk mendapatkan 1, masukkan ke HourOfDay untuk mengembalikan 'One'.

Karena PowerShell melakukan ToString pada semua objek yang ditulis ke aliran output dan tidak perlu bulu untuk mengubah ini menjadi executable ini semua yang diperlukan selain PowerShell ...

rene
sumber
2

CJam - 50

Ini adalah solusi ASCII sederhana yang menggunakan permintaan HTTP (ini diizinkan dalam pertanyaan):

"aj21.com/"r+g

Di server ada 9 file teks biasa bernama 1, 2, ..., 9, masing-masing berisi kata yang sesuai.

Ukuran total: 14 + 3 ("satu") + 3 ("dua") + 5 + 4 + 4 + 3 + 5 + 5 + 4 = 50.
Dapat bermain golf lebih banyak dengan menggunakan domain yang lebih pendek.

Juru bahasa online tidak mendukung permintaan HTTP, sehingga program harus dijalankan menggunakan juru bahasa java .

aditsu
sumber
1
Silakan tambahkan komentar jika downvoting.
aditsu
-1, ini adalah celah standar .
nyuszika7h
3
@ nyuszika7h secara khusus diizinkan dalam pertanyaan ini
aditsu
1
Maaf, saya melewatkan itu. Saya tidak dapat membatalkan downvote saya sekarang sampai jawabannya diedit.
nyuszika7h
1
@ nyuszika7h diedit
aditsu
2

Gelombang - 86

Jauh lebih pendek daripada jawaban kelompok lain, dan ternyata sangat kompetitif.

for /f "tokens=%1" %%1 in ("one two three four five six seven eight nine") do echo>%%1

Digunakan sebagai filename.bat number, dan output dalam bentuk file dengan nama nomor yang benar.

Suram
sumber
2

Ruby 64

p %w?one two three four five six seven eight nine?[$*[0].to_i-1]
Mhmd
sumber
1
Anda dapat memotong beberapa byte lagi dengan mengganti 9 secara langsung di tempat x
Mr. Alien
6
Saya tidak melihat di mana kode ini menerima input. Dan mengapa menulis 9-1ketika Anda bisa mengatakannya 8? Tentu saja keduanya 9-1dan 8itu salah; skrip ini menghasilkan "sembilan" sepanjang waktu dan mengabaikan input.
Ray Toal
2

BASH 9

Linux-replika jawaban cousincoicane yang memalukan

spd-say 1

berbicara satu

Pengguna Terdaftar
sumber
1
Bukankah ini hanya bekerja jika inputnya 1?
Jon
1
@Chipperyman berfungsi untuk nomor apa pun
Pengguna Terdaftar
Batasi, tapi pintar!
Nicolas Barbulesco
Ini merindukan input.
Nicolas Barbulesco
@nicolasbarbulesco ya. tetapi ada banyak jawaban lain yang ketinggalan input, jadi saya lanjutkan dengan ini.
Pengguna Terdaftar
2

GolfScript, 50 byte

Saya ingin melihat apakah saya bisa mengalahkan solusi GolfScript mandiri 51-byte Quincunx . Ternyata itu, dengan trik yang cukup, ya, saya bisa - dengan satu byte.

Karena salah satu trik yang saya gunakan adalah penggunaan byte di luar rentang ASCII yang dapat dicetak, program yang dihasilkan tidak dapat langsung ditempelkan di sini. Sebaliknya, saya memberikan hex dump itu; pengguna pada sistem Unixish dapat digunakan xxd -runtuk merekonstruksi program GolfScript 50-byte yang sebenarnya dari hex dump:

0000000: 7e6e 270b 97eb 442f e166 9894 9f00 c63c  ~n'...D/.f.....<
0000010: 8128 73a3 9b55 5065 a9fb f06a 2727 ff16  .(s..UPe...j''..
0000020: 277b 6261 7365 7d2f 2b6e 2f3d 7b39 392b  '{base}/+n/={99+
0000030: 7d25                                     }%

Trik dasar yang digunakan untuk menghasilkan program ini sederhana: Saya memampatkan string string panjang yang membentuk sebagian besar kode Quincunx dengan mengurangi 99 (kode ASCII surat c) dari nilai karakter, menafsirkan nilai yang dihasilkan sebagai angka di basis 22 (cukup untuk menyandikan huruf hingga x) dan kemudian menyandikan ulang angka yang dihasilkan pada basis 255 untuk menghasilkan string byte yang tidak dapat dicetak yang membentuk sebagian besar bagian pertama dari program saya. Sisa program kemudian membalikkan proses ini, mendekode ulang string menjadi sesuatu yang dapat dicetak.

(Karena huruf terendah benar-benar hadir dalam nama-nama angka adalah e, saya bisa lebih pendek string byte dengan mengurangi 101 dari kode ASCII dan menggunakan basis 20. Namun, mengurangi 101 akan memetakan surat itu oke baris baru, yang saya Saya menggunakan sebagai pembatas angka karena mudah digunakan sebagai konstanta nbawaan di GolfScript. Bekerja di sekitar itu akan membuat saya lebih mahal daripada satu byte yang menggunakan basis yang lebih rendah akan menghemat. Menggunakan offset 99 meninggalkan baris baru sesuai dengan huruf m, yang dengan mudah absen dari nama-nama nomor.)

Berikut adalah versi de-golf dari program:

~       # eval the input, turning it into a number
n       # push a newline onto the stack; we'll need it later

# this is the byte string encoding the number names:
"\x0B\x97\xEBD/\xE1f\x98\x94\x9F\x00\xC6<\x81(s\xA3\x9BUPe\xA9\xFB\xF0j"

# convert the encoded string from base 255 to base 22
# (and, incidentally, from a string to an array):
"\xFF\x16" {base}/

+       # prepend the newline pushed earlier to the array, re-stringifying it
n/      # split the resulting string at newlines
=       # pick the substring corresponding to the input number
{99+}%  # add 99 to the character values in the chosen substring
Ilmari Karonen
sumber