Konwertuj 1, 2, 3, 4, 5, 6, 7, 8 i 9 na „jeden”, „dwa”, „trzy” itd.


47

Zwycięzca: odpowiedź Bash Professorfisha ! Całe 9 bajtów! Łał!

Możesz kontynuować przesyłanie odpowiedzi, jednak nie możesz już wygrać. Oryginalny post zachowany dla potomności:


Twoim celem jest przekonwertowanie liczby całkowitej od 1 do 9 na słowo, które reprezentuje.

  • Nie będziesz musiał się martwić o ułamki dziesiętne
  • Użytkownik wprowadzi liczbę. Załóż, że nigdy nie wejdą w nic 10 lub wyższego
  • Użytkownik musi w pewnym momencie wpisać liczbę, jednak metoda odczytywana przez program nie ma znaczenia. Może to być standardowe wejście, czytanie pliku tekstowego itp., Jednak użytkownik musi w pewnym momencie nacisnąć przycisk 9 na klawiaturze (na przykład)
  • Nie jest rozróżniana wielkość liter (tzn. „Jeden”, „jeden”, „oNe”, „OnE” itp. Są dopuszczalne)
  • Żądania HTTP / etc są dozwolone, jednak każdy kod wykonywany przez serwer, który jest wysyłany, jest wliczany do liczby bajtów twojego końcowego kodu (np. Gdybym miał program C ++ wysyłający żądanie HTTP, liczy się kod PHP użyty w żądaniu HTTP )
  • Wszystko, co można skompilować i uruchomić, jest dopuszczalne

  • Konkurs zakończył się 27 czerwca 2014 r. (7 dni od opublikowania).
  • To jest , więc wygrywa najkrótszy kod

2
Czy końcowe białe znaki (tj. one ) Są dopuszczalne?
grc

1
@grc Tak, o ile program wyśle ​​słowo.
Jon

1
należy określić, że może być drukowany tylko podany numer, a nie pozostałe liczby.
Pinna_be

1
@Pinna_be na przykład, jeśli wprowadzę 3, nie możesz wyprowadzać danych wyjściowych, one two three four five six seven eight ninenawet jeśli dane techniczne są generowane three. Podobnie, nie można wyprowadzać three sevenitp.
Jon

1
To pytanie było całkiem miłe. Ale nie podoba mi się dodanie limitu daty. W szczególności limit dat został dodany tuż przed nim, a nie 7 dni wcześniej.
Nicolas Barbulesco

Odpowiedzi:


19

Bash (z bsdgames), 9

number -l

Odczytuje ze standardowego wejścia.

Nie wiem, dlaczego jest na to narzędzie, ale cokolwiek.


2
Nie jestem pewien, czy lubię instalować bsdgames, a potem nazywać je „bash”, choć przyznam, że moja rezerwacja jest subiektywna.
Paul Draper,

@PaulDraper Ja też nie. Nie napisałem tego jako poważnej odpowiedzi, myślę, że jedna z pozostałych odpowiedzi zasługiwała na akceptację

5
Czy to nie jest standardowa luka?
Justin

2
@Quincunx tak, w zasadzie tak jest. Chociaż większość rzeczy to narzędzia zewnętrzne w Bash, nie liczyłbym pakietu bsdgames jako czegoś bardzo dopuszczalnego (w przeciwieństwie do grep, wget, coreutils, sed, bc ...).

132

Python 2, 64

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

Oto jak wygląda ciąg znaków z dodatkowymi spacjami (spróbuj czytać w pionie):

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

Jak wyjaśniono w komentarzach poniżej, [input()::9]zaczyna się od podanego indeksu i wybiera co dziewiąty kolejny znak.


9
Cholera, podoba mi się to. Nawiasem mówiąc, prawdopodobnie warto zauważyć, że jest to python 2.
undergroundmonorail

3
Wytłumacz, proszę! :)
Christofer Ohlsson,

6
@ChristoferOlsson input()::9to zakres od input()do końca łańcucha w krokach 9, takich jak 1,10,19,28,37lub 3,12,21,30,39, które są dokładnie wskaźnikami, przy których znajdują się litery odpowiadającego słowa.
Martin Ender

1
@ m.buettner dzięki! To miłe.
Christofer Ohlsson

6
Czy to nie jest coś, co robi szyfr ogrodzeniowy? (Przy okazji, +1 za fajne rozwiązanie.)
Lou

18

Common Lisp - 22 bajty

Oto ogólny (nie tylko jeden-dziesięć):

(format nil"~R"(read))

Och, chcesz porządek (pierwszy, drugi, ... trzysta setny ...)? Dobrze!

(format nil"~:R"(read))

10
Czy to nie jest standardowa luka?
patrz

2
Luka w jakim sensie? Jest to jasno zdefiniowane w Hyperspec: lispworks.com/documentation/lw50/CLHS/Body/22_cba.htm
filcab


3
Niezależnie od tego, czy jest to standardowa luka, czy nie, to też przyszedłem tutaj, aby opublikować. +1 :)
Joshua Taylor

5
@ TheRare Patrząc na komentarze do tej odpowiedzi, nie sądzę, że istnieje silny konsensus społeczności, że jest to luka. Mam wrażenie, że pytania muszą wyraźnie zakazać korzystania z tego rodzaju wbudowanej funkcji, jeśli nie mają być używane.
Digital Trauma

16

BASH 51

Więc zrobiłem inny, korzystając z mojego drugiego pomysłu i pomocy innych:

set one two three four five six seven eight nine

$X

Gdzie „X” to liczba, którą chcesz.


BASH 48 (67)

67 z \npodziałem linii

Nie jestem pewien, czy to się liczy, ponieważ czyta z pliku, ale:

sed -n Xp a

Gdzie „X” to dane wejściowe, a gdzie aplik:

one
two
three
four
five
six
seven
eight
nine

Plik ma 36 znaków, a polecenie bash to 13.

Jak to działa:

Każda linia w pliku jest numerowana, zaczynając od 1. Więc „jeden” znajduje się w 1. linii, „dwa” w 2. linii. Polecenie sed -n 'Xp' amówi: „Proszę wydrukować to, co jest wymienione w wierszu„ X ”pliku„ a ””, sedto edytor strumienia Unix. -noznacza milczeć lub zasadniczo ignorować wszystko inne. Xpoznacza wydrukuj to, co jest w linii „X”.


2
Ładna pierwsza odpowiedź! Dziękujemy za poświęcenie czasu na ustalenie, w jaki sposób formatujemy nasze odpowiedzi na tej stronie. Witamy w Programowaniu zagadek i Code Golf!
Justin

2
Nie policzyłeś linii a.
Dennis

1
Jeden bajt mniej niż wcześniej, przyjmuje argument wiersza poleceń i nie wymaga dodatkowych plików: pastebin.com/qdbXKQGP Bash będzie narzekał na brakujący separator heredoc, ale będzie działał dobrze z Dashem i Zsh.
Dennis

1
@Dennis oh cool podoba mi się. Czy mam teraz edytować moją odpowiedź? Przepraszam, jestem nowy w kodowaniu golfa.
Eric Lagergren,

1
Możesz pominąć 'cytaty. Możesz także spróbować użyć ciąg tutaj zamiast zewnętrznego pliku. Ale naprawdę powinieneś policzyć podział wiersza w swoim pliku.
Cyfrowa trauma

16

C # - 127 (86/46)

Jeśli bierzesz tylko część wykonywalną ...

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

a jeśli HourOfDaybyłby częścią przestrzeni nazw Systemu, potrzebowałbyś 46 znaków. Niestety siedzi, w System.DirectoryServices.ActiveDirectoryktórym sprawia, że ​​86 ... inny hałas psuje go.

Można to skompilować i uruchomić z wiersza poleceń (127 znaków):

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

jeśli zostanie zapisany w pliku o nazwie cg2.cs

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

Jak to działa?

HourOfDay jest typem enum, więc możemy używać nazw zamiast magicznych stałych. Typy wyliczeń mają implementację ToString (), która podaje nazwę wartości . Możesz rzucić int na wyliczenie. Console.Read () odczytuje znak ze strumienia wejściowego reprezentowanego jako liczba całkowita. wpisanie „1” daje 49 , odejmowanie 48, aby uzyskać 1, rzut / pole, HourOfDayaby zwrócić „Jeden”.

Spójrz na wersję Powershell tej samej sztuczki


Jak to działa ? Powiedzmy, że wprowadzam 9. Co robi wtedy program?
Nicolas Barbulesco


Co to -48tutaj robi?
Nicolas Barbulesco

2
@NicolasBarbulesco dodał: Jak to działa? ustęp. Czy jest sens?
przedłużenie

1
@NicolasBarbulesco - Posortowane alfabetycznie. Co ma sens w każdym kontekście oprócz „Te słowa to liczby”. Ponieważ jestem pewien, że dokumentacja jest generowana automatycznie, nie ma sensu umieszczanie specjalnego artykułu w jednym przypadku.
Bobson

13

Befunge 98, 116 105 103 bajtów

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

Befunge nie został stworzony do tego ...

Wyjaśnienie:

&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

8
@Dennis Nie rozumiem, jak to może być takie trudne. Wystarczy wziąć plik, przekształcić go w char[][], miej xi ylokalizację, a następnie wykonać znak w tym miejscu. Najtrudniejsze byłoby zdefiniowanie operacji dla każdej możliwej postaci.
Justin

1
Możesz łatwo zapisać dwa bajty za pomocą &1-.
har-wradim

10

JavaScript 68

Atob / btoa może być narzędziem do kompresji biedaka (ale jeśli chcesz wypróbować to w konsoli, nie możesz kopiować ze sformatowanego tekstu, który widzisz od razu. Przejdź do „edycji” i skopiuj z panelu źródłowego)

Edytor Markdown nie lubi niektórych postaci w tej odpowiedzi: niektóre postacie gubią się podczas zapisywania. Mimo to myślę, że to problem redaktora, a nie mój. Zagubione znaki są doskonale poprawnymi 8-bitowymi znakami Unicode.
(W przeciwnym razie się mylę, jeśli ten problem był już omawiany w meta, daj mi znać). Oto wersja z obrażonymi znakami, każda sekwencja \ xNN powinna liczyć 1

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

Prosty test

W konsoli 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])

Próbowałem czegoś podobnego, ale nie mogłem znaleźć prawidłowego ciągu base64 zaczynającego się od liczby. Myślę jednak, że odpowiedź została uszkodzona przez stackexchange.
nderscore

@nderscore, cholera. Według mnie
poprawka

1
W wersji, która ma znaki ucieczki, wszystko działa oprócz 3 i 8, wyjścia Treei EightF.
Justin

3
@Quincunx 'Tree' is me not speak English
edc65

10

JavaScript 73

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

69

alert(btoa("ôéÞõ5õ1ëxO_¢êý|Þöȱõ'xß^hSôا{Ý").split(9)[prompt()])

Technicznie nie alert('0one0two0three0four0five0six0seven0eight0nine'.split(0)[#])byłoby to samo, ale zaoszczędzisz 8 bajtów? Użytkownik wciąż wprowadza
żądaną

@eric_lagergren czy masz na myśli, że użytkownik musiałby zmienić numer w źródle? Nie sądzę, żeby liczył się jako wkład.
nderscore

Dobra, rozumiem o co ci chodzi. Przypuszczam, że jeśli uruchomisz go jak polecenie w konsoli, będzie częścią wejścia, a nie źródła.
Eric Lagergren

7

Perl, 55

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

Jest uruchamiany z opcją -p(bajt +1), np .:

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

Dane wejściowe są oczekiwane w STDIN, a dane wyjściowe są zapisywane w STDOUT.

Kod po prostu generuje tablicę i wybiera odpowiedni element. Opcja -pdba o odczytanie linii wejściowej $_i wypisuje wynik $_.

Wariacje:

  • Z końcową nową linią (+3):

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

    lub (ta sama liczba bajtów):

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

Aktualizacja:

  • Używanie nagich słów zamiast qw[...](dzięki Zaid).

  • Indeks ujemny zapisuje bajt (dzięki aragaer).


1
Zapisz kilka znaków:$_=(one,two,three,four,five,six,seven,eight,nine)[$_-1]
Zaid

2
@Zaid: Dzięki, zaoszczędziłem dwa bajty. (Jestem przyzwyczajony use strict).
Heiko Oberdiek

Nie podoba mi się to „-1”. $_=(nine,eight,seven,six,five,four,three,two,one)[-$_]- jeden znak krótszy.
aragaer

@aragaer: Dzięki, fajny pomysł.
Heiko Oberdiek

6

Oracle SQL - 46

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

Demonstracja

Przyznaję, że obejmuje to standardową lukę , ale SQL jest krótszy niż Golfscript; Nie mogłem się oprzeć!

Działa według (ab) przy użyciu modeli formatu daty / godziny Oracle . TO_DATE(n, 'j')konwertuje liczbę na dzień juliański , liczbę dni od 1 stycznia 4712 pne TO_CHAR(<date>, 'jsp')konwertuje to z powrotem na liczbę całkowitą (choć jako ciąg). sp, Jest elementem przyrostek Format że czary numer. To faktycznie będzie działać z całkiem dużą liczbą liczb.

Jest &1to zmienna podstawienia, która będzie działać tylko z klientami, którzy ją akceptują, na przykład SQL * Plus.


Mam związek miłości / nienawiści z RDBMS firmy Oracle, ale to jest miłe.
przedłużenie

6

CJam, 45 43 bajtów

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

Powyższe używa notacji ^ i M, ponieważ niektóre znaki są niedrukowalne.

Kosztem kolejnych 9 bajtów można uniknąć znaków niedrukowalnych:

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

Wypróbuj online.

Jak to działa

" 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=

Przykład

$ base64 -d > convert.cjam <<< IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YktiJ2VmKydqL2xpPQ==
$ wc -c convert.cjam
43 convert.cjam
LANG=en_US cjam convert.cjam <<< 5
five

Wow, nasze odpowiedzi są identyczne, nawet pod względem długości (zakładam, że użytkownik wprowadza ciąg znaków).
Justin

1
@Quincunx: Podobne umysły myślą świetnie! : P Ale czytanie danych wejściowych użytkownika będzie kosztować dwa bajty w CJam, więc będę musiał wymyślić coś innego ...
Dennis

@Quincunx: Powinno również działać z GolfScript, chociaż prawdopodobnie nie będzie zapisywać bajtów. Zrzut Base64:IgGMOPiMFVMfl3LyoDHzA0j82AhFLPGF8TQiMjU2YmFzZSAyMGJhc2V7MTAxK30lIiIr
Dennis

Właśnie to udało mi się wymyślić; jest dłużej: golfscript.apphb.com/…
Justin

Czy wiesz, czego oczekuje kodowanie w golfa dla znaków innych niż ascii? Wygląda na to, że nie jest to utf-8
Justin

5

GolfScript, 51 bajtów

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

To prosta tabela przeglądowa. Dane wejściowe są oceniane ( ~), tworzona jest tablica wartości i znaleziony indeks.

Wypróbuj tutaj


Użytkownik musi wprowadzić ciąg, nie można go zakodować na stałe. Ponadto twój Try it herelink ma inny kod niż wklejony kod.
Jon

@Chipperyman Użytkownik wprowadza ciąg znaków w tym programie. The Try it hereróżnica Link w kodzie jest fakt, że strona internetowa nie obsługuje dane wprowadzone przez użytkownika. Zmień ciąg po ;, jest to identyczne z danymi wprowadzonymi przez użytkownika.
Justin

O, rozumiem. Nie znam dobrze gry w golfa, dziękuję za informację.
Jon

2
@Chipperyman: GolfScript umieszcza zawartość STDIN na stosie przed wykonaniem samego skryptu.
Dennis

2
Hah! Mogę cię pokonać jednym bajtem ! ;-)
Ilmari Karonen

4

Perl, 60 bajtów

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

Wymaga -pprzełącznika (dwa bajty).

Przykład

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

Jak to działa

  • -podczytuje ze STDIN i zapisuje wynik w $_.

  • =~/.[a-z]*/g dzieli poprzednie słowo na podciągi jednej (dużej) litery, po której następuje dowolna liczba małych liter.

  • (…) zbiera podciągi do tablicy.

  • [$_] pobiera podciąg odpowiadający wprowadzonemu przez użytkownika.

  • $_=…zapisuje wynik w $_.

  • -pwypisuje wartość $_.


2
Lubię sztuczkę regularną. +1
patrz

3

Partia DOS - 162 znaki (łącznie z podziałami linii)

Ta odpowiedź została zainspirowana odpowiedzią Python @ grc, chociaż miałem na myśli coś podobnego.

@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

Stosowanie:

[Nazwa pliku] [numer]

Na przykład, jeśli kod znajduje się w pliku o nazwie speak.bat, a chcesz zobaczyć liczbę „pięć”, uruchom go jako:

speak 5

Ponadto wyjście jest od góry do dołu, a nie od lewej do prawej! Więc zamiast

pięć

zobaczysz

f
i
v
e


3

Bash + coreutils, 64

Niekonkurencyjna koncepcja kompresji

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

Niektóre z egzotycznych znaków tutaj mogą nie wyświetlać się dobrze, więc ten skrypt można zrekonstruować z jego reprezentacji base64:

base64 -d <<< eHhkIC1wPDw8VOCLUIJu4PWWDzrgc8B+rkDjEoBDTnx0ciAwLTlhLWQgXFxuZy1pbm9yLXh8c2VkIC1uICQxcA==

Przykładowe dane wyjściowe

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

Wyjaśnienie

Przyszło mi do głowy, że ciąg one two three four five six seven eight ninezawiera tylko litery efghinorstuvwxi separator spacji - łącznie 15 znaków. Zatem każdy znak może być potencjalnie reprezentowany w 4 bitach lub 2 znakach na 1 bajt. Możemy użyć szesnastkowej reprezentacji bajtu jako łatwego sposobu podzielenia każdego bajtu na dwie cyfry szesnastkowe. Następnie możemy przekształcić cyfry szesnastkowe z powrotem w litery, których potrzebujemy, używając trpodobnych znaków . Na szczęście, rstuvwxsą kolejne, więc można wyrazić co r-xdo tr. Kodowanie jest umieszczony tak, że ei fpozostaje tak jak jest oraz że słowa końca linii oddzielone, tak można użyć seddo ouptut tylko linię potrzebujemy.

Ten proces dekodowania kończy się z wykorzystaniem dużej ilości dodatkowej przestrzeni, więc ta odpowiedź jest niekonkurencyjna jako odpowiedź w stylu skryptu powłoki, ale może być użyteczną koncepcją w innych językach.


3

(czysty) Bash, 64

Bierze dane wejściowe jako pierwszy argument, przy założeniu poprawności danych wejściowych.

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

Tworzy tablicę v, a następnie uzyskuje dostęp do elementu określonego na wejściu. Ponieważ tablice są indeksowane od zera, musiałem dodać 0 element jako symbol zastępczy. Alternatywnie (dzięki @DennisWilliamson za wskazanie tego):

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

2
Liczba znaków: v=(one two three four five six seven eight nine)iecho ${v[$1-1]}
Dennis Williamson

3

Python 2.x - 65 64

Nie tak dobra jak odpowiedź @grc, ale z pewnością bardziej czytelna :-)

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

O jeden mniej char, dzięki @flornquake

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

Ten też jest miły. :-) To działa.
Nicolas Barbulesco

3
Możesz zapisać jedną postać w ten sposób:'nine eight seven six five four three two one'.split()[-input()]
trzęsienie ziemi

To miło!
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]);
    }}

3

C 111

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

Długość tutaj jest starannie zaprojektowany, aby można było interpretować jako binarne i przekonwertować że do przecinku. Przy zaledwie 7 postaciach jestem pewien, że mam zwycięzcę!


1
Gracze +1 Code zwykle nie mają nic przeciwko, jeśli Twój kod c kompiluje się z ostrzeżeniami , o ile spełnia on specyfikację. Więc można pominąć #includei main()jest zwracany typ. Także trochę refactoring swojej wypowiedzi: main(){printf("%.5s","one two threefour five six seveneightnine"+5*getchar()-245);}. 86 znaków według mojej liczby.
Digital Trauma

Nie dostaję długości i nie widzę, gdzie byłoby 7 znaków.
Nicolas Barbulesco

@NicolasBarbulesco: To 111 znaków - ale jeśli traktujemy je 111jako binarne, to zamieniamy je 7na dziesiętne.
Jerry Coffin

Jerry, masz w głowie golfa!
Nicolas Barbulesco,

3

powiedz bash (OS X): 3 8

„Twoim celem jest przekonwertowanie liczby całkowitej z zakresu od 1 do 9 na słowo, które reprezentuje”

Kiedy ostatnio sprawdzałem, wypowiadane słowa również są słowami. Poprzednia próba (nie przyjmuje danych wejściowych)

say 4

Edycja, musi być w stanie odczytać dane wejściowe:

say|read

Wpisz dowolny numer, a pojawi się słowo. Wiem, że data końcowa jest zbliżona, ale moim zdaniem powinienem był wygrać konkurs.

Przykładowy plik audio: four.aiff


nie powinno być 5?
rpax

@rpax Nie wierzę, że dane wejściowe są liczone jako znak, prawda?
CousinCocaine

1
To jest sprytne. Ale to pomija dane wejściowe.
Nicolas Barbulesco

1
Niestety nie jest to prawidłowa odpowiedź, ponieważ: Nigdy nie akceptuje danych wejściowych użytkownika ORAZ działa tylko, jeśli liczba wynosi 4.
Jon

1
Komentarz Chipperymana do tej odpowiedzi CousinCocaine jest prawdziwy. Ale dotyczy to również odpowiedzi @RegisteredUser . Chipperyman odrzucił jednak tę odpowiedź przez CousinCocaine i zadeklarował odpowiedź zwycięzcy zarejestrowanego użytkownika ex æquo. Ponadto odpowiedź Zarejestrowanego Użytkownika jest repliką tej odpowiedzi autorstwa CousinCocaine. To więcej niż niesprawiedliwe.
Nicolas Barbulesco

2

VBScript 98 80 75

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

2

J - 68 lub 60 57 lub 53 bajtów

Wersja interaktywna (stdin):

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

Wersja funkcji:

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

Wyjaśnienie:

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

".(1!:1)1 odczytuje ciąg znaków i konwertuje go na liczbę całkowitą


Możesz zapisać jeden znak, pisząc go jako pociąg ( (;:'one two blah')>@{~<:), a kolejny sześć, używając gerunda one`two`blahzamiast ;:.
algorytmshark

@al algorytmshark Thanks! Wciąż uczę się J. Chociaż wersja pociągu nie wymagałaby, aby tekst miał nieskończoną pozycję (edytuj: najwyraźniej nie ... dlaczego nie?), A wersja Gerunda dodatkowe cytaty (edycja: och, tworzy listę pudła)?
patrz

Rozwidlenie może mieć rzeczownik w lewym argumencie, który jest skrótem od stałego czasownika, który tworzy rzeczownik o nieskończonej randze (qv Słownik ). I nie, nie ma dodatkowych cytatów na temat gerunda: niezdefiniowane nazwy są traktowane jako odniesienia do czasowników, a gerund do tego jest po prostu ciągiem w ramce zawierającym nazwę.
algorytmshark

Ponadto nie musisz pisać wersji STDIN jako wyrażenia czasownika: >one`two`three`four`five`six`seven`eight`nine{~<:".1!:1]1jest on o 3 znaki krótszy.
algorytmshark

1
@ algorytmshark Haha, dlaczego tego nie zrobiłem?
patrz

2

Perl 36 (58 samodzielny)

use Number::Spell;say spell_number<>

Lub bez dodatkowych modułów:

say qw(one two three four five six seven eight nine)[<>-1]

Twój pierwszy skrypt nie działa na moim komputerze Mac. 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

Twój drugi skrypt nie działa na moim komputerze Mac. 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

W AppleScript; 123 znaki.

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

Ten skrypt pobiera dane wejściowe w oknie dialogowym. Następnie daje wynik w wynikach AppleScript  .

Przykład:

  • Wejście : 6
  • Wynik : "six"

Oto ładniejsza wersja:

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

Ta wersja wyświetla dane wyjściowe w ładnym oknie dialogowym.

Przykład:

  • Wejście : 9
  • Wynik : nine

[Odpowiedź zredagowana; nieznacznie poprawiono okno dialogowe dla danych wejściowych; wciąż 124 znaki. Odpowiedź edytowana ponownie; teraz 1 char mniej! ]


1
set n to text returned of... Łał.
patrz

2

PowerShell - 91 74

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

Dowiedz się, jak przesłać, aby usunąć połączenie Enum i ToObject:

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

Jak to działa?

HourOfDay jest rodzajem enum, więc możemy używać nazw zamiast magicznych stałych. Typy wyliczeń mają implementację ToString (), która podaje nazwę stałej wartości. Możesz rzucić int na wyliczenie. Console.Read () odczytuje znak ze strumienia wejściowego reprezentowanego jako liczba całkowita. wpisanie „1” daje 49, odejmowanie 48, aby uzyskać 1, i przesłać na HourOfDay, aby zwrócić „Jeden”.

Ponieważ PowerShell wykonuje ToString na wszystkich obiektach zapisywanych do strumienia wyjściowego i nie potrzebuje puchu, aby zamienić to w plik wykonywalny, to wszystko, co jest potrzebne oprócz PowerShell ...


2

CJam - 50

To jest proste rozwiązanie ASCII, które wykorzystuje żądania HTTP (jest to dozwolone w pytaniu):

"aj21.com/"r+g

Na serwerze znajduje się 9 plików tekstowych o nazwach 1, 2, ..., 9, z których każdy zawiera odpowiednie słowo.

Całkowity rozmiar: 14 + 3 („jeden”) + 3 („dwa”) + 5 + 4 + 4 + 3 + 5 + 5 + 4 = 50.
Można grać w golfa więcej, używając krótszej domeny.

Tłumacz online nie obsługuje żądań HTTP, więc program musi być uruchamiany przy użyciu interpretera Java .


1
Dodaj komentarz, jeśli głosujesz w dół.
aditsu

-1, jest to standardowa luka .
nyuszika7h

3
@ nyuszika7h jest to dozwolone w tym pytaniu
aditsu

1
Przepraszam, tęskniłem za tym. Nie mogę cofnąć głosowania, dopóki odpowiedź nie zostanie edytowana.
nyuszika7h

1
@ nyuszika7h edytowane
aditsu

2

Partia - 86

Zdecydowanie krótszy niż druga odpowiedź na zestaw i faktycznie zaskakująco konkurencyjny.

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

Używany jako filename.bat number, a wynik jest w postaci pliku o nazwie poprawnej liczby.


2

Ruby 64

p %w?one two three four five six seven eight nine?[$*[0].to_i-1]

1
Możesz posiekać jeszcze kilka bajtów, podstawiając 9 bezpośrednio w miejscu x
Mr. Alien

6
Nie widzę, gdzie ten kod pobiera dane wejściowe. I 9-1po co pisać, skoro możesz po prostu powiedzieć 8? Oczywiście oba 9-1i 8są złe; ten skrypt wypisuje „dziewięć” przez cały czas i ignoruje dane wejściowe.
Ray Toal

2

BASH 9

bezwstydna replika linuksa odpowiedzi kuzyna

spd-say 1

mówi jeden


1
Czy nie zadziałałoby to tylko, gdyby wartość wejściowa wynosiła 1?
Jon

1
@Chipperyman to działa na dowolny numer
Zarejestrowany użytkownik

Limit, ale sprytny!
Nicolas Barbulesco

Pomija to dane wejściowe.
Nicolas Barbulesco

@nicolasbarbulesco tak. ale było wiele innych odpowiedzi, w których brakowało danych wejściowych, więc zacząłem z tym.
Zarejestrowany użytkownik

2

GolfScript, 50 bajtów

Chciałem sprawdzić, czy uda mi się pokonać 51-bajtowe samodzielne rozwiązanie GolfScript firmy Quincunx . Okazuje się, że przy wystarczającej liczbie lew, tak, mogę - jednym bajtem.

Ponieważ jedną ze sztuczek, których używam, jest użycie bajtów spoza zakresu drukowalnego ASCII, wynikowego programu nie można tutaj wkleić bezpośrednio. Zamiast tego dostarczam zrzut heksowy; użytkownicy systemów Unixish mogą użyć xxd -rdo zrekonstruowania rzeczywistego 50-bajtowego programu GolfScript z zrzutu heksadecymalnego:

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

Podstawowa sztuczka użyta do wygenerowania tego programu jest prosta: kompresuję długi ciąg literału, który stanowi większość kodu Quincunx, odejmując 99 (kod ASCII litery c) od wartości znaków, interpretując uzyskane wartości jako liczbę w podstawie 22 (wystarczająco, aby zakodować litery do x), a następnie ponownie zakodować wynikową liczbę w bazie 255, aby wygenerować niedrukowalny ciąg bajtów, który stanowi większość pierwszej połowy mojego programu. Reszta programu następnie odwraca ten proces, dekodując ciąg z powrotem do czegoś, co można wydrukować.

(Ponieważ najniższa litera faktycznie obecna w nazwach liczb to e, mógłbym jeszcze bardziej skrócić ciąg bajtów, odejmując 101 od kodów ASCII i używając podstawy 20. Jednak odjęcie 101 spowodowałoby odwzorowanie litery ona nowy wiersz, który ja używam jako separatora liczb, ponieważ jest on dogodnie dostępny jako wbudowana stała nw GolfScript. Obejście tego kosztowałoby mnie więcej niż jeden bajt, który oszczędziłby użycie dolnej podstawy. Korzystanie z przesunięcia 99 pozostawia nową linię odpowiadającą literze m, który jest dogodnie nieobecny w nazwach numerów).

Oto wersja programu bez golfa:

~       # 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.